Skip to content

Commit bfcd807

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Add baselineUserLocationsDuration to Impossible Travel rule options (#3866)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent bf52c89 commit bfcd807

6 files changed

Lines changed: 199 additions & 2 deletions

File tree

.generator/schemas/v2/openapi.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70685,11 +70685,20 @@ components:
7068570685
properties:
7068670686
baselineUserLocations:
7068770687
$ref: "#/components/schemas/SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocations"
70688+
baselineUserLocationsDuration:
70689+
$ref: "#/components/schemas/SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocationsDuration"
7068870690
type: object
7068970691
SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocations:
7069070692
description: "If true, signals are suppressed for the first 24 hours. In that time, Datadog learns the user's regular\naccess locations. This can be helpful to reduce noise and infer VPN usage or credentialed API access."
7069170693
example: true
7069270694
type: boolean
70695+
SecurityMonitoringRuleImpossibleTravelOptionsBaselineUserLocationsDuration:
70696+
description: The duration in days during which Datadog learns the user's regular access locations. After this period, signals are generated for accesses from unknown locations.
70697+
format: int32
70698+
maximum: 30
70699+
minimum: 1
70700+
nullable: true
70701+
type: integer
7069370702
SecurityMonitoringRuleInstantaneousBaseline:
7069470703
description: When set to true, Datadog uses previous values that fall within the defined learning window to construct the baseline, enabling the system to establish an accurate baseline more rapidly rather than relying solely on gradual learning over time.
7069570704
example: false
@@ -143305,6 +143314,7 @@ paths:
143305143314
hardcodedEvaluatorType: log4shell
143306143315
impossibleTravelOptions:
143307143316
baselineUserLocations: true
143317+
baselineUserLocationsDuration: 7
143308143318
newValueOptions:
143309143319
instantaneousBaseline: false
143310143320
learningMethod: duration
@@ -144061,6 +144071,7 @@ paths:
144061144071
hardcodedEvaluatorType: log4shell
144062144072
impossibleTravelOptions:
144063144073
baselineUserLocations: true
144074+
baselineUserLocationsDuration: 7
144064144075
keepAlive: 3600
144065144076
maxSignalDuration: 86400
144066144077
newValueOptions:
@@ -144162,6 +144173,7 @@ paths:
144162144173
hardcodedEvaluatorType: log4shell
144163144174
impossibleTravelOptions:
144164144175
baselineUserLocations: true
144176+
baselineUserLocationsDuration: 7
144165144177
keepAlive: 0
144166144178
maxSignalDuration: 0
144167144179
newValueOptions:
@@ -144275,6 +144287,7 @@ paths:
144275144287
hardcodedEvaluatorType: log4shell
144276144288
impossibleTravelOptions:
144277144289
baselineUserLocations: true
144290+
baselineUserLocationsDuration: 7
144278144291
keepAlive: 1800
144279144292
maxSignalDuration: 1800
144280144293
newValueOptions:
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Create a detection rule with type 'impossible_travel' and baselineUserLocationsDuration returns
2+
// "OK" response
3+
4+
import com.datadog.api.client.ApiClient;
5+
import com.datadog.api.client.ApiException;
6+
import com.datadog.api.client.v2.api.SecurityMonitoringApi;
7+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleCaseCreate;
8+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleCreatePayload;
9+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleDetectionMethod;
10+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleEvaluationWindow;
11+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleImpossibleTravelOptions;
12+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleKeepAlive;
13+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleMaxSignalDuration;
14+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleOptions;
15+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleQueryAggregation;
16+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleResponse;
17+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleSeverity;
18+
import com.datadog.api.client.v2.model.SecurityMonitoringRuleTypeCreate;
19+
import com.datadog.api.client.v2.model.SecurityMonitoringStandardRuleCreatePayload;
20+
import com.datadog.api.client.v2.model.SecurityMonitoringStandardRuleQuery;
21+
import java.util.Collections;
22+
23+
public class Example {
24+
public static void main(String[] args) {
25+
ApiClient defaultClient = ApiClient.getDefaultApiClient();
26+
SecurityMonitoringApi apiInstance = new SecurityMonitoringApi(defaultClient);
27+
28+
SecurityMonitoringRuleCreatePayload body =
29+
new SecurityMonitoringRuleCreatePayload(
30+
new SecurityMonitoringStandardRuleCreatePayload()
31+
.queries(
32+
Collections.singletonList(
33+
new SecurityMonitoringStandardRuleQuery()
34+
.aggregation(SecurityMonitoringRuleQueryAggregation.GEO_DATA)
35+
.groupByFields(Collections.singletonList("@usr.id"))
36+
.metric("@network.client.geoip")
37+
.query("*")))
38+
.cases(
39+
Collections.singletonList(
40+
new SecurityMonitoringRuleCaseCreate()
41+
.name("")
42+
.status(SecurityMonitoringRuleSeverity.INFO)))
43+
.hasExtendedTitle(true)
44+
.message("test")
45+
.isEnabled(true)
46+
.options(
47+
new SecurityMonitoringRuleOptions()
48+
.maxSignalDuration(SecurityMonitoringRuleMaxSignalDuration.ONE_DAY)
49+
.evaluationWindow(SecurityMonitoringRuleEvaluationWindow.FIFTEEN_MINUTES)
50+
.keepAlive(SecurityMonitoringRuleKeepAlive.ONE_HOUR)
51+
.detectionMethod(SecurityMonitoringRuleDetectionMethod.IMPOSSIBLE_TRAVEL)
52+
.impossibleTravelOptions(
53+
new SecurityMonitoringRuleImpossibleTravelOptions()
54+
.baselineUserLocations(true)
55+
.baselineUserLocationsDuration(7)))
56+
.name("Example-Security-Monitoring")
57+
.type(SecurityMonitoringRuleTypeCreate.LOG_DETECTION));
58+
59+
try {
60+
SecurityMonitoringRuleResponse result = apiInstance.createSecurityMonitoringRule(body);
61+
System.out.println(result);
62+
} catch (ApiException e) {
63+
System.err.println(
64+
"Exception when calling SecurityMonitoringApi#createSecurityMonitoringRule");
65+
System.err.println("Status code: " + e.getCode());
66+
System.err.println("Reason: " + e.getResponseBody());
67+
System.err.println("Response headers: " + e.getResponseHeaders());
68+
e.printStackTrace();
69+
}
70+
}
71+
}

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

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
import java.util.HashMap;
1616
import java.util.Map;
1717
import java.util.Objects;
18+
import org.openapitools.jackson.nullable.JsonNullable;
1819

1920
/** Options on impossible travel detection method. */
2021
@JsonPropertyOrder({
21-
SecurityMonitoringRuleImpossibleTravelOptions.JSON_PROPERTY_BASELINE_USER_LOCATIONS
22+
SecurityMonitoringRuleImpossibleTravelOptions.JSON_PROPERTY_BASELINE_USER_LOCATIONS,
23+
SecurityMonitoringRuleImpossibleTravelOptions.JSON_PROPERTY_BASELINE_USER_LOCATIONS_DURATION
2224
})
2325
@jakarta.annotation.Generated(
2426
value = "https://github.com/DataDog/datadog-api-client-java/blob/master/.generator")
@@ -27,6 +29,10 @@ public class SecurityMonitoringRuleImpossibleTravelOptions {
2729
public static final String JSON_PROPERTY_BASELINE_USER_LOCATIONS = "baselineUserLocations";
2830
private Boolean baselineUserLocations;
2931

32+
public static final String JSON_PROPERTY_BASELINE_USER_LOCATIONS_DURATION =
33+
"baselineUserLocationsDuration";
34+
private JsonNullable<Integer> baselineUserLocationsDuration = JsonNullable.<Integer>undefined();
35+
3036
public SecurityMonitoringRuleImpossibleTravelOptions baselineUserLocations(
3137
Boolean baselineUserLocations) {
3238
this.baselineUserLocations = baselineUserLocations;
@@ -51,6 +57,40 @@ public void setBaselineUserLocations(Boolean baselineUserLocations) {
5157
this.baselineUserLocations = baselineUserLocations;
5258
}
5359

60+
public SecurityMonitoringRuleImpossibleTravelOptions baselineUserLocationsDuration(
61+
Integer baselineUserLocationsDuration) {
62+
this.baselineUserLocationsDuration = JsonNullable.<Integer>of(baselineUserLocationsDuration);
63+
return this;
64+
}
65+
66+
/**
67+
* The duration in days during which Datadog learns the user's regular access locations. After
68+
* this period, signals are generated for accesses from unknown locations. minimum: 1 maximum: 30
69+
*
70+
* @return baselineUserLocationsDuration
71+
*/
72+
@jakarta.annotation.Nullable
73+
@JsonIgnore
74+
public Integer getBaselineUserLocationsDuration() {
75+
return baselineUserLocationsDuration.orElse(null);
76+
}
77+
78+
@JsonProperty(JSON_PROPERTY_BASELINE_USER_LOCATIONS_DURATION)
79+
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
80+
public JsonNullable<Integer> getBaselineUserLocationsDuration_JsonNullable() {
81+
return baselineUserLocationsDuration;
82+
}
83+
84+
@JsonProperty(JSON_PROPERTY_BASELINE_USER_LOCATIONS_DURATION)
85+
public void setBaselineUserLocationsDuration_JsonNullable(
86+
JsonNullable<Integer> baselineUserLocationsDuration) {
87+
this.baselineUserLocationsDuration = baselineUserLocationsDuration;
88+
}
89+
90+
public void setBaselineUserLocationsDuration(Integer baselineUserLocationsDuration) {
91+
this.baselineUserLocationsDuration = JsonNullable.<Integer>of(baselineUserLocationsDuration);
92+
}
93+
5494
/**
5595
* A container for additional, undeclared properties. This is a holder for any undeclared
5696
* properties as specified with the 'additionalProperties' keyword in the OAS document.
@@ -112,14 +152,17 @@ public boolean equals(Object o) {
112152
return Objects.equals(
113153
this.baselineUserLocations,
114154
securityMonitoringRuleImpossibleTravelOptions.baselineUserLocations)
155+
&& Objects.equals(
156+
this.baselineUserLocationsDuration,
157+
securityMonitoringRuleImpossibleTravelOptions.baselineUserLocationsDuration)
115158
&& Objects.equals(
116159
this.additionalProperties,
117160
securityMonitoringRuleImpossibleTravelOptions.additionalProperties);
118161
}
119162

120163
@Override
121164
public int hashCode() {
122-
return Objects.hash(baselineUserLocations, additionalProperties);
165+
return Objects.hash(baselineUserLocations, baselineUserLocationsDuration, additionalProperties);
123166
}
124167

125168
@Override
@@ -129,6 +172,9 @@ public String toString() {
129172
sb.append(" baselineUserLocations: ")
130173
.append(toIndentedString(baselineUserLocations))
131174
.append("\n");
175+
sb.append(" baselineUserLocationsDuration: ")
176+
.append(toIndentedString(baselineUserLocationsDuration))
177+
.append("\n");
132178
sb.append(" additionalProperties: ")
133179
.append(toIndentedString(additionalProperties))
134180
.append("\n");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2026-05-20T15:12:27.397Z
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
[
2+
{
3+
"httpRequest": {
4+
"body": {
5+
"type": "JSON",
6+
"json": "{\"cases\":[{\"name\":\"\",\"notifications\":[],\"status\":\"info\"}],\"filters\":[],\"hasExtendedTitle\":true,\"isEnabled\":true,\"message\":\"test\",\"name\":\"Test-Create_a_detection_rule_with_type_impossible_travel_and_baselineUserLocationsDuration_returns_OK_res-1779289947\",\"options\":{\"detectionMethod\":\"impossible_travel\",\"evaluationWindow\":900,\"impossibleTravelOptions\":{\"baselineUserLocations\":true,\"baselineUserLocationsDuration\":7},\"keepAlive\":3600,\"maxSignalDuration\":86400},\"queries\":[{\"aggregation\":\"geo_data\",\"distinctFields\":[],\"groupByFields\":[\"@usr.id\"],\"metric\":\"@network.client.geoip\",\"query\":\"*\"}],\"tags\":[],\"type\":\"log_detection\"}"
7+
},
8+
"headers": {},
9+
"method": "POST",
10+
"path": "/api/v2/security_monitoring/rules",
11+
"keepAlive": false,
12+
"secure": true
13+
},
14+
"httpResponse": {
15+
"body": "{\"name\":\"Test-Create_a_detection_rule_with_type_impossible_travel_and_baselineUserLocationsDuration_returns_OK_res-1779289947\",\"createdAt\":1779289949181,\"isDefault\":false,\"isPartner\":false,\"isEnabled\":true,\"isBeta\":false,\"isDeleted\":false,\"isDeprecated\":false,\"queries\":[{\"query\":\"*\",\"groupByFields\":[\"@usr.id\"],\"hasOptionalGroupByFields\":false,\"distinctFields\":[],\"metric\":\"@network.client.geoip\",\"metrics\":[\"@network.client.geoip\"],\"aggregation\":\"geo_data\",\"name\":\"\",\"dataSource\":\"logs\"}],\"options\":{\"evaluationWindow\":900,\"detectionMethod\":\"impossible_travel\",\"maxSignalDuration\":86400,\"keepAlive\":3600,\"impossibleTravelOptions\":{\"baselineUserLocations\":true,\"baselineUserLocationsDuration\":7,\"detectIpTransition\":false}},\"cases\":[{\"name\":\"\",\"status\":\"info\",\"notifications\":[]}],\"message\":\"test\",\"tags\":[],\"hasExtendedTitle\":true,\"type\":\"log_detection\",\"filters\":[],\"version\":1,\"id\":\"v2k-viu-svz\",\"blocking\":false,\"metadata\":{\"entities\":null,\"sources\":null},\"creationAuthorId\":2320499,\"creator\":{\"handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"name\":\"CI Account\"},\"updater\":{\"handle\":\"\",\"name\":\"\"}}",
16+
"headers": {
17+
"Content-Type": [
18+
"application/json"
19+
]
20+
},
21+
"statusCode": 200,
22+
"reasonPhrase": "OK"
23+
},
24+
"times": {
25+
"remainingTimes": 1
26+
},
27+
"timeToLive": {
28+
"unlimited": true
29+
},
30+
"id": "da934758-4baf-fca8-2600-4d9183d89974"
31+
},
32+
{
33+
"httpRequest": {
34+
"headers": {},
35+
"method": "DELETE",
36+
"path": "/api/v2/security_monitoring/rules/v2k-viu-svz",
37+
"keepAlive": false,
38+
"secure": true
39+
},
40+
"httpResponse": {
41+
"headers": {},
42+
"statusCode": 204,
43+
"reasonPhrase": "No Content"
44+
},
45+
"times": {
46+
"remainingTimes": 1
47+
},
48+
"timeToLive": {
49+
"unlimited": true
50+
},
51+
"id": "4e836004-731a-1940-03a9-6f0169bd0eed"
52+
}
53+
]

src/test/resources/com/datadog/api/client/v2/api/security_monitoring.feature

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,19 @@ Feature: Security Monitoring
559559
And the response "type" is equal to "application_security"
560560
And the response "message" is equal to "Test rule"
561561

562+
@skip-validation @team:DataDog/k9-cloud-siem
563+
Scenario: Create a detection rule with type 'impossible_travel' and baselineUserLocationsDuration returns "OK" response
564+
Given new "CreateSecurityMonitoringRule" request
565+
And body with value {"queries":[{"aggregation":"geo_data","groupByFields":["@usr.id"],"distinctFields":[],"metric":"@network.client.geoip","query":"*"}],"cases":[{"name":"","status":"info","notifications":[]}],"hasExtendedTitle":true,"message":"test","isEnabled":true,"options":{"maxSignalDuration":86400,"evaluationWindow":900,"keepAlive":3600,"detectionMethod":"impossible_travel","impossibleTravelOptions":{"baselineUserLocations":true,"baselineUserLocationsDuration":7}},"name":"{{ unique }}","type":"log_detection","tags":[],"filters":[]}
566+
When the request is sent
567+
Then the response status is 200 OK
568+
And the response "name" is equal to "{{ unique }}"
569+
And the response "type" is equal to "log_detection"
570+
And the response "message" is equal to "test"
571+
And the response "options.detectionMethod" is equal to "impossible_travel"
572+
And the response "options.impossibleTravelOptions.baselineUserLocations" is equal to true
573+
And the response "options.impossibleTravelOptions.baselineUserLocationsDuration" is equal to 7
574+
562575
@skip-validation @team:DataDog/k9-cloud-siem
563576
Scenario: Create a detection rule with type 'impossible_travel' returns "OK" response
564577
Given new "CreateSecurityMonitoringRule" request

0 commit comments

Comments
 (0)