Skip to content

Commit 3a4e8ab

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Cloud SIEM - Add instantaneousBaseline feature parameter. (#1063)
Co-authored-by: ci.datadog-api-spec <[email protected]>
1 parent b8c79ce commit 3a4e8ab

6 files changed

+148
-0
lines changed

.generator/schemas/v2/openapi.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47596,6 +47596,8 @@ components:
4759647596
properties:
4759747597
forgetAfter:
4759847598
$ref: '#/components/schemas/SecurityMonitoringRuleNewValueOptionsForgetAfter'
47599+
instantaneousBaseline:
47600+
$ref: '#/components/schemas/SecurityMonitoringRuleNewValueOptionsInstantaneousBaseline'
4759947601
learningDuration:
4760047602
$ref: '#/components/schemas/SecurityMonitoringRuleNewValueOptionsLearningDuration'
4760147603
learningMethod:
@@ -47621,6 +47623,13 @@ components:
4762147623
- TWO_WEEKS
4762247624
- THREE_WEEKS
4762347625
- FOUR_WEEKS
47626+
SecurityMonitoringRuleNewValueOptionsInstantaneousBaseline:
47627+
description: When set to true, Datadog uses previous values that fall within
47628+
the defined learning window to construct the baseline, enabling the system
47629+
to establish an accurate baseline more rapidly rather than relying solely
47630+
on gradual learning over time.
47631+
example: false
47632+
type: boolean
4762447633
SecurityMonitoringRuleNewValueOptionsLearningDuration:
4762547634
default: 0
4762647635
description: 'The duration in days during which values are learned, and after
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Validate a detection rule with detection method 'new_value' with enabled
2+
// feature 'instantaneousBaseline' returns "OK" response
3+
use datadog_api_client::datadog;
4+
use datadog_api_client::datadogV2::api_security_monitoring::SecurityMonitoringAPI;
5+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleCaseCreate;
6+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleDetectionMethod;
7+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleEvaluationWindow;
8+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleKeepAlive;
9+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleMaxSignalDuration;
10+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleNewValueOptions;
11+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleNewValueOptionsForgetAfter;
12+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleNewValueOptionsLearningDuration;
13+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleNewValueOptionsLearningMethod;
14+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleNewValueOptionsLearningThreshold;
15+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleOptions;
16+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleQueryAggregation;
17+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleSeverity;
18+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleTypeCreate;
19+
use datadog_api_client::datadogV2::model::SecurityMonitoringRuleValidatePayload;
20+
use datadog_api_client::datadogV2::model::SecurityMonitoringStandardDataSource;
21+
use datadog_api_client::datadogV2::model::SecurityMonitoringStandardRulePayload;
22+
use datadog_api_client::datadogV2::model::SecurityMonitoringStandardRuleQuery;
23+
24+
#[tokio::main]
25+
async fn main() {
26+
let body =
27+
SecurityMonitoringRuleValidatePayload::SecurityMonitoringStandardRulePayload(
28+
Box::new(
29+
SecurityMonitoringStandardRulePayload::new(
30+
vec![
31+
SecurityMonitoringRuleCaseCreate::new(SecurityMonitoringRuleSeverity::INFO)
32+
.name("".to_string())
33+
.notifications(vec![])
34+
],
35+
true,
36+
"My security monitoring rule".to_string(),
37+
"My security monitoring rule".to_string(),
38+
SecurityMonitoringRuleOptions::new()
39+
.detection_method(SecurityMonitoringRuleDetectionMethod::NEW_VALUE)
40+
.evaluation_window(SecurityMonitoringRuleEvaluationWindow::ZERO_MINUTES)
41+
.keep_alive(SecurityMonitoringRuleKeepAlive::FIVE_MINUTES)
42+
.max_signal_duration(SecurityMonitoringRuleMaxSignalDuration::TEN_MINUTES)
43+
.new_value_options(
44+
SecurityMonitoringRuleNewValueOptions::new()
45+
.forget_after(SecurityMonitoringRuleNewValueOptionsForgetAfter::ONE_WEEK)
46+
.instantaneous_baseline(true)
47+
.learning_duration(SecurityMonitoringRuleNewValueOptionsLearningDuration::ONE_DAY)
48+
.learning_method(SecurityMonitoringRuleNewValueOptionsLearningMethod::DURATION)
49+
.learning_threshold(
50+
SecurityMonitoringRuleNewValueOptionsLearningThreshold::ZERO_OCCURRENCES,
51+
),
52+
),
53+
vec![
54+
SecurityMonitoringStandardRuleQuery::new()
55+
.aggregation(SecurityMonitoringRuleQueryAggregation::NEW_VALUE)
56+
.data_source(SecurityMonitoringStandardDataSource::LOGS)
57+
.distinct_fields(vec![])
58+
.group_by_fields(vec!["@userIdentity.assumed_role".to_string()])
59+
.metric("name".to_string())
60+
.metrics(vec!["name".to_string()])
61+
.name("".to_string())
62+
.query("source:source_here".to_string())
63+
],
64+
)
65+
.has_extended_title(true)
66+
.tags(vec!["env:prod".to_string(), "team:security".to_string()])
67+
.type_(SecurityMonitoringRuleTypeCreate::LOG_DETECTION),
68+
),
69+
);
70+
let configuration = datadog::Configuration::new();
71+
let api = SecurityMonitoringAPI::with_config(configuration);
72+
let resp = api.validate_security_monitoring_rule(body).await;
73+
if let Ok(value) = resp {
74+
println!("{:#?}", value);
75+
} else {
76+
println!("{:#?}", resp.unwrap_err());
77+
}
78+
}

src/datadogV2/model/model_security_monitoring_rule_new_value_options.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ pub struct SecurityMonitoringRuleNewValueOptions {
1515
#[serde(rename = "forgetAfter")]
1616
pub forget_after:
1717
Option<crate::datadogV2::model::SecurityMonitoringRuleNewValueOptionsForgetAfter>,
18+
/// 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.
19+
#[serde(rename = "instantaneousBaseline")]
20+
pub instantaneous_baseline: Option<bool>,
1821
/// The duration in days during which values are learned, and after which signals will be generated for values that
1922
/// weren't learned. If set to 0, a signal will be generated for all new values after the first value is learned.
2023
#[serde(rename = "learningDuration")]
@@ -39,6 +42,7 @@ impl SecurityMonitoringRuleNewValueOptions {
3942
pub fn new() -> SecurityMonitoringRuleNewValueOptions {
4043
SecurityMonitoringRuleNewValueOptions {
4144
forget_after: None,
45+
instantaneous_baseline: None,
4246
learning_duration: None,
4347
learning_method: None,
4448
learning_threshold: None,
@@ -55,6 +59,11 @@ impl SecurityMonitoringRuleNewValueOptions {
5559
self
5660
}
5761

62+
pub fn instantaneous_baseline(mut self, value: bool) -> Self {
63+
self.instantaneous_baseline = Some(value);
64+
self
65+
}
66+
5867
pub fn learning_duration(
5968
mut self,
6069
value: crate::datadogV2::model::SecurityMonitoringRuleNewValueOptionsLearningDuration,
@@ -114,6 +123,7 @@ impl<'de> Deserialize<'de> for SecurityMonitoringRuleNewValueOptions {
114123
let mut forget_after: Option<
115124
crate::datadogV2::model::SecurityMonitoringRuleNewValueOptionsForgetAfter,
116125
> = None;
126+
let mut instantaneous_baseline: Option<bool> = None;
117127
let mut learning_duration: Option<
118128
crate::datadogV2::model::SecurityMonitoringRuleNewValueOptionsLearningDuration,
119129
> = None;
@@ -146,6 +156,13 @@ impl<'de> Deserialize<'de> for SecurityMonitoringRuleNewValueOptions {
146156
}
147157
}
148158
}
159+
"instantaneousBaseline" => {
160+
if v.is_null() {
161+
continue;
162+
}
163+
instantaneous_baseline =
164+
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
165+
}
149166
"learningDuration" => {
150167
if v.is_null() {
151168
continue;
@@ -201,6 +218,7 @@ impl<'de> Deserialize<'de> for SecurityMonitoringRuleNewValueOptions {
201218

202219
let content = SecurityMonitoringRuleNewValueOptions {
203220
forget_after,
221+
instantaneous_baseline,
204222
learning_duration,
205223
learning_method,
206224
learning_threshold,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2025-12-10T08:37:17.537Z
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"http_interactions": [
3+
{
4+
"request": {
5+
"body": {
6+
"string": "{\"cases\":[{\"name\":\"\",\"notifications\":[],\"status\":\"info\"}],\"hasExtendedTitle\":true,\"isEnabled\":true,\"message\":\"My security monitoring rule\",\"name\":\"My security monitoring rule\",\"options\":{\"detectionMethod\":\"new_value\",\"evaluationWindow\":0,\"keepAlive\":300,\"maxSignalDuration\":600,\"newValueOptions\":{\"forgetAfter\":7,\"instantaneousBaseline\":true,\"learningDuration\":1,\"learningMethod\":\"duration\",\"learningThreshold\":0}},\"queries\":[{\"aggregation\":\"new_value\",\"dataSource\":\"logs\",\"distinctFields\":[],\"groupByFields\":[\"@userIdentity.assumed_role\"],\"metric\":\"name\",\"metrics\":[\"name\"],\"name\":\"\",\"query\":\"source:source_here\"}],\"tags\":[\"env:prod\",\"team:security\"],\"type\":\"log_detection\"}",
7+
"encoding": null
8+
},
9+
"headers": {
10+
"Accept": [
11+
"*/*"
12+
],
13+
"Content-Type": [
14+
"application/json"
15+
]
16+
},
17+
"method": "post",
18+
"uri": "https://api.datadoghq.com/api/v2/security_monitoring/rules/validation"
19+
},
20+
"response": {
21+
"body": {
22+
"string": "",
23+
"encoding": null
24+
},
25+
"headers": {},
26+
"status": {
27+
"code": 204,
28+
"message": "No Content"
29+
}
30+
},
31+
"recorded_at": "Wed, 10 Dec 2025 08:37:17 GMT"
32+
}
33+
],
34+
"recorded_with": "VCR 6.0.0"
35+
}

tests/scenarios/features/v2/security_monitoring.feature

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,6 +1764,13 @@ Feature: Security Monitoring
17641764
When the request is sent
17651765
Then the response status is 204 OK
17661766

1767+
@team:DataDog/k9-cloud-security-platform
1768+
Scenario: Validate a detection rule with detection method 'new_value' with enabled feature 'instantaneousBaseline' returns "OK" response
1769+
Given new "ValidateSecurityMonitoringRule" request
1770+
And body with value {"cases":[{"name":"","status":"info","notifications":[]}],"hasExtendedTitle":true,"isEnabled":true,"message":"My security monitoring rule","name":"My security monitoring rule","options":{"evaluationWindow":0,"keepAlive":300,"maxSignalDuration":600,"detectionMethod":"new_value","newValueOptions":{"forgetAfter":7,"instantaneousBaseline":true,"learningDuration":1,"learningThreshold":0,"learningMethod":"duration"}},"queries":[{"query":"source:source_here","groupByFields":["@userIdentity.assumed_role"],"distinctFields":[],"metric":"name","metrics":["name"],"aggregation":"new_value","name":"","dataSource":"logs"}],"tags":["env:prod","team:security"],"type":"log_detection"}
1771+
When the request is sent
1772+
Then the response status is 204 OK
1773+
17671774
@team:DataDog/k9-cloud-security-platform
17681775
Scenario: Validate a detection rule with detection method 'sequence_detection' returns "OK" response
17691776
Given new "ValidateSecurityMonitoringRule" request

0 commit comments

Comments
 (0)