Skip to content

Commit 833cac3

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Add actions and groupSignalsBy field in detection rules API (#2704)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent f17e4a7 commit 833cac3

File tree

100 files changed

+1020
-104
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+1020
-104
lines changed

.apigentools-info

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
"spec_versions": {
55
"v1": {
66
"apigentools_version": "1.6.6",
7-
"regenerated": "2025-02-10 19:09:34.449930",
8-
"spec_repo_commit": "824f78a1"
7+
"regenerated": "2025-02-11 09:59:45.428513",
8+
"spec_repo_commit": "b980d49f"
99
},
1010
"v2": {
1111
"apigentools_version": "1.6.6",
12-
"regenerated": "2025-02-10 19:09:34.468088",
13-
"spec_repo_commit": "824f78a1"
12+
"regenerated": "2025-02-11 09:59:45.443328",
13+
"spec_repo_commit": "b980d49f"
1414
}
1515
}
1616
}

.generator/schemas/v2/openapi.yaml

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15657,6 +15657,15 @@ components:
1565715657
example: 1729843470000
1565815658
format: int64
1565915659
type: integer
15660+
groupSignalsBy:
15661+
description: Additional grouping to perform on top of the existing groups
15662+
in the query section. Must be a subset of the existing groups.
15663+
example:
15664+
- service
15665+
items:
15666+
description: Field to group by.
15667+
type: string
15668+
type: array
1566015669
index:
1566115670
description: Index used to load the data.
1566215671
example: cloud_siem
@@ -24242,6 +24251,11 @@ components:
2424224251
SecurityMonitoringRuleCase:
2424324252
description: Case when signal is generated.
2424424253
properties:
24254+
actions:
24255+
description: Action to perform for each rule case.
24256+
items:
24257+
$ref: '#/components/schemas/SecurityMonitoringRuleCaseAction'
24258+
type: array
2424524259
condition:
2424624260
description: 'A rule case contains logical operations (`>`,`>=`, `&&`, `||`)
2424724261
to determine if a signal should be generated
@@ -24260,9 +24274,42 @@ components:
2426024274
status:
2426124275
$ref: '#/components/schemas/SecurityMonitoringRuleSeverity'
2426224276
type: object
24277+
SecurityMonitoringRuleCaseAction:
24278+
description: Action to perform when a signal is triggered. Only available for
24279+
Application Security rule type.
24280+
properties:
24281+
options:
24282+
$ref: '#/components/schemas/SecurityMonitoringRuleCaseActionOptions'
24283+
type:
24284+
$ref: '#/components/schemas/SecurityMonitoringRuleCaseActionType'
24285+
type: object
24286+
SecurityMonitoringRuleCaseActionOptions:
24287+
description: Options for the rule action
24288+
properties:
24289+
duration:
24290+
description: Duration of the action in seconds. 0 indicates no expiration.
24291+
example: 0
24292+
format: int64
24293+
minimum: 0
24294+
type: integer
24295+
type: object
24296+
SecurityMonitoringRuleCaseActionType:
24297+
description: The action type.
24298+
enum:
24299+
- block_ip
24300+
- block_user
24301+
type: string
24302+
x-enum-varnames:
24303+
- BLOCK_IP
24304+
- BLOCK_USER
2426324305
SecurityMonitoringRuleCaseCreate:
2426424306
description: Case when signal is generated.
2426524307
properties:
24308+
actions:
24309+
description: Action to perform for each rule case.
24310+
items:
24311+
$ref: '#/components/schemas/SecurityMonitoringRuleCaseAction'
24312+
type: array
2426624313
condition:
2426724314
description: 'A case contains logical operations (`>`,`>=`, `&&`, `||`)
2426824315
to determine if a signal should be generated
@@ -24724,6 +24771,15 @@ components:
2472424771
items:
2472524772
$ref: '#/components/schemas/SecurityMonitoringFilter'
2472624773
type: array
24774+
groupSignalsBy:
24775+
description: Additional grouping to perform on top of the existing groups
24776+
in the query section. Must be a subset of the existing groups.
24777+
example:
24778+
- service
24779+
items:
24780+
description: Field to group by.
24781+
type: string
24782+
type: array
2472724783
hasExtendedTitle:
2472824784
description: Whether the notifications include the triggering group-by values
2472924785
in their title.
@@ -25429,6 +25485,15 @@ components:
2542925485
items:
2543025486
$ref: '#/components/schemas/SecurityMonitoringFilter'
2543125487
type: array
25488+
groupSignalsBy:
25489+
description: Additional grouping to perform on top of the existing groups
25490+
in the query section. Must be a subset of the existing groups.
25491+
example:
25492+
- service
25493+
items:
25494+
description: Field to group by.
25495+
type: string
25496+
type: array
2543225497
hasExtendedTitle:
2543325498
description: Whether the notifications include the triggering group-by values
2543425499
in their title.
@@ -25501,6 +25566,15 @@ components:
2550125566
items:
2550225567
$ref: '#/components/schemas/SecurityMonitoringFilter'
2550325568
type: array
25569+
groupSignalsBy:
25570+
description: Additional grouping to perform on top of the existing groups
25571+
in the query section. Must be a subset of the existing groups.
25572+
example:
25573+
- service
25574+
items:
25575+
description: Field to group by.
25576+
type: string
25577+
type: array
2550425578
hasExtendedTitle:
2550525579
description: Whether the notifications include the triggering group-by values
2550625580
in their title.
@@ -25642,6 +25716,15 @@ components:
2564225716
items:
2564325717
$ref: '#/components/schemas/SecurityMonitoringFilter'
2564425718
type: array
25719+
groupSignalsBy:
25720+
description: Additional grouping to perform on top of the existing groups
25721+
in the query section. Must be a subset of the existing groups.
25722+
example:
25723+
- service
25724+
items:
25725+
description: Field to group by.
25726+
type: string
25727+
type: array
2564525728
hasExtendedTitle:
2564625729
description: Whether the notifications include the triggering group-by values
2564725730
in their title.
@@ -25719,6 +25802,15 @@ components:
2571925802
items:
2572025803
$ref: '#/components/schemas/SecurityMonitoringFilter'
2572125804
type: array
25805+
groupSignalsBy:
25806+
description: Additional grouping to perform on top of the existing groups
25807+
in the query section. Must be a subset of the existing groups.
25808+
example:
25809+
- service
25810+
items:
25811+
description: Field to group by.
25812+
type: string
25813+
type: array
2572225814
hasExtendedTitle:
2572325815
description: Whether the notifications include the triggering group-by values
2572425816
in their title.
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Create a detection rule with type 'application_security 'returns "OK" response
2+
3+
import com.datadog.api.client.ApiClient;
4+
import com.datadog.api.client.ApiException;
5+
import com.datadog.api.client.v2.api.SecurityMonitoringApi;
6+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleCaseAction;
7+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleCaseActionOptions;
8+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleCaseActionType;
9+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleCaseCreate;
10+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleCreatePayload;
11+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleDetectionMethod;
12+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleEvaluationWindow;
13+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleKeepAlive;
14+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleMaxSignalDuration;
15+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleOptions;
16+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleQueryAggregation;
17+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleResponse;
18+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleSeverity;
19+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleTypeCreate;
20+
import com.datadog.api.client.v2.model.SecurityMonitoringStandardRuleCreatePayload;
21+
import com.datadog.api.client.v2.model.SecurityMonitoringStandardRuleQuery;
22+
import java.util.Arrays;
23+
import java.util.Collections;
24+
25+
public class Example {
26+
public static void main(String[] args) {
27+
ApiClient defaultClient = ApiClient.getDefaultApiClient();
28+
SecurityMonitoringApi apiInstance = new SecurityMonitoringApi(defaultClient);
29+
30+
SecurityMonitoringRuleCreatePayload body =
31+
new SecurityMonitoringRuleCreatePayload(
32+
new SecurityMonitoringStandardRuleCreatePayload()
33+
.type(SecurityMonitoringRuleTypeCreate.APPLICATION_SECURITY)
34+
.name("Example-Security-Monitoring_appsec_rule")
35+
.queries(
36+
Collections.singletonList(
37+
new SecurityMonitoringStandardRuleQuery()
38+
.query("@appsec.security_activity:business_logic.users.login.failure")
39+
.aggregation(SecurityMonitoringRuleQueryAggregation.COUNT)
40+
.groupByFields(Arrays.asList("service", "@http.client_ip"))))
41+
.cases(
42+
Collections.singletonList(
43+
new SecurityMonitoringRuleCaseCreate()
44+
.name("")
45+
.status(SecurityMonitoringRuleSeverity.INFO)
46+
.condition("a > 100000")
47+
.actions(
48+
Collections.singletonList(
49+
new SecurityMonitoringRuleCaseAction()
50+
.type(SecurityMonitoringRuleCaseActionType.BLOCK_IP)
51+
.options(
52+
new SecurityMonitoringRuleCaseActionOptions()
53+
.duration(900L))))))
54+
.options(
55+
new SecurityMonitoringRuleOptions()
56+
.keepAlive(SecurityMonitoringRuleKeepAlive.ONE_HOUR)
57+
.maxSignalDuration(SecurityMonitoringRuleMaxSignalDuration.ONE_DAY)
58+
.evaluationWindow(SecurityMonitoringRuleEvaluationWindow.FIFTEEN_MINUTES)
59+
.detectionMethod(SecurityMonitoringRuleDetectionMethod.THRESHOLD))
60+
.isEnabled(true)
61+
.message("Test rule")
62+
.groupSignalsBy(Collections.singletonList("service")));
63+
64+
try {
65+
SecurityMonitoringRuleResponse result = apiInstance.createSecurityMonitoringRule(body);
66+
System.out.println(result);
67+
} catch (ApiException e) {
68+
System.err.println(
69+
"Exception when calling SecurityMonitoringApi#createSecurityMonitoringRule");
70+
System.err.println("Status code: " + e.getCode());
71+
System.err.println("Reason: " + e.getResponseBody());
72+
System.err.println("Response headers: " + e.getResponseHeaders());
73+
e.printStackTrace();
74+
}
75+
}
76+
}

src/main/java/com/datadog/api/client/v2/model/JobDefinition.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
JobDefinition.JSON_PROPERTY_CALCULATED_FIELDS,
2525
JobDefinition.JSON_PROPERTY_CASES,
2626
JobDefinition.JSON_PROPERTY_FROM,
27+
JobDefinition.JSON_PROPERTY_GROUP_SIGNALS_BY,
2728
JobDefinition.JSON_PROPERTY_INDEX,
2829
JobDefinition.JSON_PROPERTY_MESSAGE,
2930
JobDefinition.JSON_PROPERTY_NAME,
@@ -48,6 +49,9 @@ public class JobDefinition {
4849
public static final String JSON_PROPERTY_FROM = "from";
4950
private Long from;
5051

52+
public static final String JSON_PROPERTY_GROUP_SIGNALS_BY = "groupSignalsBy";
53+
private List<String> groupSignalsBy = null;
54+
5155
public static final String JSON_PROPERTY_INDEX = "index";
5256
private String index;
5357

@@ -182,6 +186,36 @@ public void setFrom(Long from) {
182186
this.from = from;
183187
}
184188

189+
public JobDefinition groupSignalsBy(List<String> groupSignalsBy) {
190+
this.groupSignalsBy = groupSignalsBy;
191+
return this;
192+
}
193+
194+
public JobDefinition addGroupSignalsByItem(String groupSignalsByItem) {
195+
if (this.groupSignalsBy == null) {
196+
this.groupSignalsBy = new ArrayList<>();
197+
}
198+
this.groupSignalsBy.add(groupSignalsByItem);
199+
return this;
200+
}
201+
202+
/**
203+
* Additional grouping to perform on top of the existing groups in the query section. Must be a
204+
* subset of the existing groups.
205+
*
206+
* @return groupSignalsBy
207+
*/
208+
@jakarta.annotation.Nullable
209+
@JsonProperty(JSON_PROPERTY_GROUP_SIGNALS_BY)
210+
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
211+
public List<String> getGroupSignalsBy() {
212+
return groupSignalsBy;
213+
}
214+
215+
public void setGroupSignalsBy(List<String> groupSignalsBy) {
216+
this.groupSignalsBy = groupSignalsBy;
217+
}
218+
185219
public JobDefinition index(String index) {
186220
this.index = index;
187221
return this;
@@ -492,6 +526,7 @@ public boolean equals(Object o) {
492526
return Objects.equals(this.calculatedFields, jobDefinition.calculatedFields)
493527
&& Objects.equals(this.cases, jobDefinition.cases)
494528
&& Objects.equals(this.from, jobDefinition.from)
529+
&& Objects.equals(this.groupSignalsBy, jobDefinition.groupSignalsBy)
495530
&& Objects.equals(this.index, jobDefinition.index)
496531
&& Objects.equals(this.message, jobDefinition.message)
497532
&& Objects.equals(this.name, jobDefinition.name)
@@ -511,6 +546,7 @@ public int hashCode() {
511546
calculatedFields,
512547
cases,
513548
from,
549+
groupSignalsBy,
514550
index,
515551
message,
516552
name,
@@ -531,6 +567,7 @@ public String toString() {
531567
sb.append(" calculatedFields: ").append(toIndentedString(calculatedFields)).append("\n");
532568
sb.append(" cases: ").append(toIndentedString(cases)).append("\n");
533569
sb.append(" from: ").append(toIndentedString(from)).append("\n");
570+
sb.append(" groupSignalsBy: ").append(toIndentedString(groupSignalsBy)).append("\n");
534571
sb.append(" index: ").append(toIndentedString(index)).append("\n");
535572
sb.append(" message: ").append(toIndentedString(message)).append("\n");
536573
sb.append(" name: ").append(toIndentedString(name)).append("\n");

0 commit comments

Comments
 (0)