Skip to content

Commit 2f6563d

Browse files
authored
Merge pull request #59 from JupiterOne/TD-7432
add 5 new input parameters to the alert rule methods
2 parents 5b63b5d + 3814384 commit 2f6563d

File tree

4 files changed

+158
-11
lines changed

4 files changed

+158
-11
lines changed

README.md

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,24 @@ complex_rule = j1.create_alert_rule(
905905
AND u.tag.Role != 'admin'
906906
"""
907907
)
908+
909+
# Create alert rule with advanced configuration options
910+
advanced_rule = j1.create_alert_rule(
911+
name="Advanced Security Monitoring",
912+
description="Comprehensive security monitoring with custom settings",
913+
tags=['security', 'monitoring'],
914+
polling_interval="ONE_HOUR",
915+
severity="HIGH",
916+
j1ql="FIND Finding WITH severity = 'HIGH'",
917+
query_name="security_findings", # Custom query name
918+
trigger_actions_on_new_entities_only=False, # Trigger on all entities
919+
ignore_previous_results=True, # Ignore previous evaluation results
920+
notify_on_failure=True, # Notify on evaluation failures
921+
templates={ # Custom templates for alert content
922+
"AlertSummary": "Security Finding: {{item.displayName}} - Severity: {{item.severity}}",
923+
"DetailedReport": "Finding ID: {{item._id}}\nDescription: {{item.description}}\nSeverity: {{item.severity}}"
924+
}
925+
)
908926
```
909927

910928
##### Create Alert Rule with Action Config
@@ -1127,7 +1145,14 @@ updated_rule = j1.update_alert_rule(
11271145
tag_op="OVERWRITE",
11281146
severity="INFO",
11291147
action_configs=alert_rule_config_tag,
1130-
action_configs_op="OVERWRITE"
1148+
action_configs_op="OVERWRITE",
1149+
query_name="updated_findings", # Update query name
1150+
trigger_actions_on_new_entities_only=False, # Update trigger behavior
1151+
ignore_previous_results=True, # Update result handling
1152+
notify_on_failure=False, # Update notification settings
1153+
templates={ # Update templates
1154+
"NewTemplate": "Updated: {{item.displayName}} - {{item.severity}}"
1155+
}
11311156
)
11321157

11331158
# Update only tags (overwrite existing)
@@ -1156,6 +1181,24 @@ j1.update_alert_rule(
11561181
polling_interval="THIRTY_MINUTES",
11571182
severity="HIGH"
11581183
)
1184+
1185+
# Update advanced configuration parameters
1186+
j1.update_alert_rule(
1187+
rule_id='<id-of-alert-rule>',
1188+
query_name="custom_query_name", # Update query name
1189+
trigger_actions_on_new_entities_only=True, # Only trigger on new entities
1190+
ignore_previous_results=False, # Consider previous results
1191+
notify_on_failure=True # Notify on evaluation failures
1192+
)
1193+
1194+
# Update templates for alert content
1195+
j1.update_alert_rule(
1196+
rule_id='<id-of-alert-rule>',
1197+
templates={
1198+
"SecurityAlert": "Security Issue: {{item.displayName}}",
1199+
"ComplianceReport": "Compliance Violation: {{item.description}}"
1200+
}
1201+
)
11591202
```
11601203

11611204
##### Evaluate Alert Rule

examples/05_alert_rules_and_smartclasses.py

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,26 @@ def alert_rule_examples(j1):
3838
)
3939
print(f"Created basic alert rule: {basic_rule['id']}\n")
4040

41+
# 1.5. Advanced alert rule with new parameters
42+
print("1.5. Creating an advanced alert rule with new parameters:")
43+
advanced_rule = j1.create_alert_rule(
44+
name="Advanced Security Monitoring",
45+
description="Comprehensive security monitoring with custom settings",
46+
tags=['security', 'monitoring'],
47+
polling_interval="ONE_HOUR",
48+
severity="HIGH",
49+
j1ql="FIND Finding WITH severity = 'HIGH'",
50+
query_name="security_findings", # Custom query name
51+
trigger_actions_on_new_entities_only=False, # Trigger on all entities
52+
ignore_previous_results=True, # Ignore previous evaluation results
53+
notify_on_failure=True, # Notify on evaluation failures
54+
templates={ # Custom templates for alert content
55+
"AlertSummary": "Security Finding: {{item.displayName}} - Severity: {{item.severity}}",
56+
"DetailedReport": "Finding ID: {{item._id}}\nDescription: {{item.description}}\nSeverity: {{item.severity}}"
57+
}
58+
)
59+
print(f"Created advanced alert rule: {advanced_rule['id']}\n")
60+
4161
# 2. Complex alert rule with multiple conditions
4262
print("2. Creating a complex alert rule:")
4363
complex_rule = j1.create_alert_rule(
@@ -57,7 +77,7 @@ def alert_rule_examples(j1):
5777
)
5878
print(f"Created complex alert rule: {complex_rule['id']}\n")
5979

60-
return basic_rule, complex_rule
80+
return basic_rule, advanced_rule, complex_rule
6181

6282
def alert_rule_with_actions_examples(j1):
6383
"""Demonstrate alert rules with action configurations."""
@@ -206,13 +226,50 @@ def alert_rule_management_examples(j1, rule_id):
206226
polling_interval="ONE_WEEK",
207227
tags=['security', 'compliance', 'updated'],
208228
tag_op="OVERWRITE",
209-
severity="INFO"
229+
severity="INFO",
230+
query_name="updated_findings", # Update query name
231+
trigger_actions_on_new_entities_only=False, # Update trigger behavior
232+
ignore_previous_results=True, # Update result handling
233+
notify_on_failure=False, # Update notification settings
234+
templates={ # Update templates
235+
"NewTemplate": "Updated: {{item.displayName}} - {{item.severity}}"
236+
}
210237
)
211238
print(f"Updated alert rule: {updated_rule['id']}")
212239
except Exception as e:
213240
print(f"Error updating alert rule: {e}")
214241
print()
215242

243+
# 3.5. Update specific advanced parameters
244+
print("3.5. Updating specific advanced parameters:")
245+
try:
246+
# Update only query name
247+
j1.update_alert_rule(
248+
rule_id=rule_id,
249+
query_name="custom_query_name"
250+
)
251+
print("Updated query name")
252+
253+
# Update trigger behavior
254+
j1.update_alert_rule(
255+
rule_id=rule_id,
256+
trigger_actions_on_new_entities_only=True
257+
)
258+
print("Updated trigger behavior")
259+
260+
# Update templates
261+
j1.update_alert_rule(
262+
rule_id=rule_id,
263+
templates={
264+
"SecurityAlert": "Security Issue: {{item.displayName}}",
265+
"ComplianceReport": "Compliance Violation: {{item.description}}"
266+
}
267+
)
268+
print("Updated templates")
269+
except Exception as e:
270+
print(f"Error updating advanced parameters: {e}")
271+
print()
272+
216273
# 4. Evaluate alert rule
217274
print("4. Evaluating alert rule:")
218275
try:
@@ -406,7 +463,7 @@ def main():
406463
print("✓ Client setup successful\n")
407464

408465
# Run examples
409-
basic_rule, complex_rule = alert_rule_examples(j1)
466+
basic_rule, advanced_rule, complex_rule = alert_rule_examples(j1)
410467
webhook_rule, multi_action_rule = alert_rule_with_actions_examples(j1)
411468

412469
# Alert rule management (using the basic rule)

jupiterone/client.py

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,21 +1032,26 @@ def create_alert_rule(
10321032
j1ql: str = None,
10331033
action_configs: Union[Dict, List[Dict]] = None,
10341034
resource_group_id: str = None,
1035+
query_name: str = "query0",
1036+
trigger_actions_on_new_entities_only: bool = True,
1037+
ignore_previous_results: bool = False,
1038+
notify_on_failure: bool = True,
1039+
templates: Dict[str, str] = None,
10351040
):
10361041
"""Create Alert Rule Configuration in J1 account"""
10371042

10381043
variables = {
10391044
"instance": {
10401045
"name": name,
10411046
"description": description,
1042-
"notifyOnFailure": True,
1043-
"triggerActionsOnNewEntitiesOnly": True,
1044-
"ignorePreviousResults": False,
1047+
"notifyOnFailure": notify_on_failure,
1048+
"triggerActionsOnNewEntitiesOnly": trigger_actions_on_new_entities_only,
1049+
"ignorePreviousResults": ignore_previous_results,
10451050
"operations": [
10461051
{
10471052
"when": {
10481053
"type": "FILTER",
1049-
"condition": ["AND", ["queries.query0.total", ">", 0]],
1054+
"condition": ["AND", [f"queries.{query_name}.total", ">", 0]],
10501055
},
10511056
"actions": [
10521057
{
@@ -1064,7 +1069,7 @@ def create_alert_rule(
10641069
"queries": [
10651070
{
10661071
"query": j1ql,
1067-
"name": "query0",
1072+
"name": query_name,
10681073
"version": "v1",
10691074
"includeDeleted": False,
10701075
}
@@ -1073,7 +1078,7 @@ def create_alert_rule(
10731078
"specVersion": 1,
10741079
"tags": tags,
10751080
"labels": labels,
1076-
"templates": {},
1081+
"templates": templates if templates is not None else {},
10771082
"resourceGroupId": resource_group_id,
10781083
}
10791084
}
@@ -1112,6 +1117,11 @@ def update_alert_rule(
11121117
action_configs: Union[Dict, List[Dict]] = None,
11131118
action_configs_op: str = None,
11141119
resource_group_id: str = None,
1120+
query_name: str = None,
1121+
trigger_actions_on_new_entities_only: bool = None,
1122+
ignore_previous_results: bool = None,
1123+
notify_on_failure: bool = None,
1124+
templates: Dict[str, str] = None,
11151125
):
11161126
"""Update Alert Rule Configuration in J1 account"""
11171127
# fetch existing alert rule
@@ -1151,6 +1161,13 @@ def update_alert_rule(
11511161
del question_config["__typename"]
11521162
del question_config["queries"][0]["__typename"]
11531163

1164+
# update query name if provided
1165+
if query_name is not None:
1166+
# update query name in question config
1167+
question_config["queries"][0]["name"] = query_name
1168+
# update condition reference to use new query name
1169+
operations[0]["when"]["condition"] = ["AND", [f"queries.{query_name}.total", ">", 0]]
1170+
11541171
# update polling_interval if provided
11551172
if polling_interval is not None:
11561173
interval_config = polling_interval
@@ -1171,6 +1188,8 @@ def update_alert_rule(
11711188
# update labels list if provided
11721189
if labels is not None:
11731190
label_config = labels
1191+
else:
1192+
label_config = alert_rule_config.get("labels", [])
11741193

11751194
# update action_configs list if provided
11761195
if action_configs is not None:
@@ -1203,18 +1222,46 @@ def update_alert_rule(
12031222
if severity is not None:
12041223
operations[0]["actions"][0]["targetValue"] = severity
12051224

1225+
# update trigger_actions_on_new_entities_only if provided
1226+
if trigger_actions_on_new_entities_only is not None:
1227+
trigger_config = trigger_actions_on_new_entities_only
1228+
else:
1229+
trigger_config = alert_rule_config["triggerActionsOnNewEntitiesOnly"]
1230+
1231+
# update ignore_previous_results if provided
1232+
if ignore_previous_results is not None:
1233+
ignore_config = ignore_previous_results
1234+
else:
1235+
ignore_config = alert_rule_config["ignorePreviousResults"]
1236+
1237+
# update notify_on_failure if provided
1238+
if notify_on_failure is not None:
1239+
notify_config = notify_on_failure
1240+
else:
1241+
notify_config = alert_rule_config["notifyOnFailure"]
1242+
1243+
# update templates if provided
1244+
if templates is not None:
1245+
templates_config = templates
1246+
else:
1247+
templates_config = alert_rule_config["templates"]
1248+
12061249
variables = {
12071250
"instance": {
12081251
"id": rule_id,
12091252
"version": rule_version,
12101253
"specVersion": alert_rule_config["specVersion"],
12111254
"name": alert_name,
12121255
"description": alert_description,
1256+
"notifyOnFailure": notify_config,
1257+
"triggerActionsOnNewEntitiesOnly": trigger_config,
1258+
"ignorePreviousResults": ignore_config,
12131259
"question": question_config,
12141260
"operations": operations,
12151261
"pollingInterval": interval_config,
12161262
"tags": tags_config,
12171263
"labels": label_config,
1264+
"templates": templates_config,
12181265
"resourceGroupId": resource_group_id,
12191266
}
12201267
}

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setup(
77
name="jupiterone",
8-
version="1.6.1",
8+
version="1.7.0",
99
description="A Python client for the JupiterOne API",
1010
license="MIT License",
1111
author="JupiterOne",

0 commit comments

Comments
 (0)