diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index f61f0719ac..a40d500d9e 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -9658,13 +9658,11 @@ components: MonitorFormulaAndFunctionCostDataSource: description: Data source for cost queries. enum: - - metrics - cloud_cost - datadog_usage example: "cloud_cost" type: string x-enum-varnames: - - METRICS - CLOUD_COST - DATADOG_USAGE MonitorFormulaAndFunctionCostQueryDefinition: @@ -10106,6 +10104,34 @@ components: - DATABASE_QUERIES - NETWORK - NETWORK_PATH + MonitorFormulaAndFunctionMetricQueryDataSource: + description: Data source for metrics queries. + enum: + - metrics + example: "metrics" + type: string + x-enum-varnames: + - METRICS + MonitorFormulaAndFunctionMetricQueryDefinition: + description: A formula and functions metrics query. The `aggregator` field is required for `cost alert` monitors and not allowed for metric or query alert monitors. + properties: + aggregator: + $ref: "#/components/schemas/MonitorFormulaAndFunctionCostAggregator" + data_source: + $ref: "#/components/schemas/MonitorFormulaAndFunctionMetricQueryDataSource" + name: + description: Name of the query for use in formulas. + example: "query1" + type: string + query: + description: The metrics query definition. + example: "avg:system.cpu.user{*}" + type: string + required: + - name + - data_source + - query + type: object MonitorFormulaAndFunctionMetricsAggregator: description: Aggregator for metrics queries. enum: @@ -10175,6 +10201,7 @@ components: - $ref: "#/components/schemas/MonitorFormulaAndFunctionDataJobsQueryDefinition" - $ref: "#/components/schemas/MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition" - $ref: "#/components/schemas/MonitorFormulaAndFunctionAggregateFilteredQueryDefinition" + - $ref: "#/components/schemas/MonitorFormulaAndFunctionMetricQueryDefinition" MonitorFormulaAndFunctionReferenceTableColumn: additionalProperties: false description: A column definition for reference table queries. diff --git a/examples/v1/monitors/CreateMonitor_2419923374.py b/examples/v1/monitors/CreateMonitor_2419923374.py new file mode 100644 index 0000000000..000f154b26 --- /dev/null +++ b/examples/v1/monitors/CreateMonitor_2419923374.py @@ -0,0 +1,48 @@ +""" +Create a monitor with a metrics formula variable returns "OK" response +""" + +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v1.api.monitors_api import MonitorsApi +from datadog_api_client.v1.model.monitor import Monitor +from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_data_source import ( + MonitorFormulaAndFunctionMetricQueryDataSource, +) +from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_definition import ( + MonitorFormulaAndFunctionMetricQueryDefinition, +) +from datadog_api_client.v1.model.monitor_options import MonitorOptions +from datadog_api_client.v1.model.monitor_thresholds import MonitorThresholds +from datadog_api_client.v1.model.monitor_type import MonitorType + +body = Monitor( + name="Example-Monitor", + type=MonitorType.QUERY_ALERT, + query='formula("query1").rollup("avg").last("5m") > threshold', + message="some message Notify: @hipchat-channel", + tags=[ + "test:examplemonitor", + "env:ci", + ], + options=MonitorOptions( + thresholds=MonitorThresholds( + critical_query='formula("query1").rollup("p99").last("1w").multiplier(1.5)', + ), + variables=[ + MonitorFormulaAndFunctionMetricQueryDefinition( + name="query1", + data_source=MonitorFormulaAndFunctionMetricQueryDataSource.METRICS, + query="avg:system.cpu.user{*}", + ), + ], + ), +) + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = MonitorsApi(api_client) + response = api_instance.create_monitor(body=body) + + print(response) diff --git a/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_data_source.py b/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_data_source.py index e3d1cd0d6e..971ef3e893 100644 --- a/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_data_source.py +++ b/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_data_source.py @@ -16,16 +16,14 @@ class MonitorFormulaAndFunctionCostDataSource(ModelSimple): """ Data source for cost queries. - :param value: Must be one of ["metrics", "cloud_cost", "datadog_usage"]. + :param value: Must be one of ["cloud_cost", "datadog_usage"]. :type value: str """ allowed_values = { - "metrics", "cloud_cost", "datadog_usage", } - METRICS: ClassVar["MonitorFormulaAndFunctionCostDataSource"] CLOUD_COST: ClassVar["MonitorFormulaAndFunctionCostDataSource"] DATADOG_USAGE: ClassVar["MonitorFormulaAndFunctionCostDataSource"] @@ -36,6 +34,5 @@ def openapi_types(_): } -MonitorFormulaAndFunctionCostDataSource.METRICS = MonitorFormulaAndFunctionCostDataSource("metrics") MonitorFormulaAndFunctionCostDataSource.CLOUD_COST = MonitorFormulaAndFunctionCostDataSource("cloud_cost") MonitorFormulaAndFunctionCostDataSource.DATADOG_USAGE = MonitorFormulaAndFunctionCostDataSource("datadog_usage") diff --git a/src/datadog_api_client/v1/model/monitor_formula_and_function_metric_query_data_source.py b/src/datadog_api_client/v1/model/monitor_formula_and_function_metric_query_data_source.py new file mode 100644 index 0000000000..2f48f8a52f --- /dev/null +++ b/src/datadog_api_client/v1/model/monitor_formula_and_function_metric_query_data_source.py @@ -0,0 +1,35 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + + +from datadog_api_client.model_utils import ( + ModelSimple, + cached_property, +) + +from typing import ClassVar + + +class MonitorFormulaAndFunctionMetricQueryDataSource(ModelSimple): + """ + Data source for metrics queries. + + :param value: If omitted defaults to "metrics". Must be one of ["metrics"]. + :type value: str + """ + + allowed_values = { + "metrics", + } + METRICS: ClassVar["MonitorFormulaAndFunctionMetricQueryDataSource"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +MonitorFormulaAndFunctionMetricQueryDataSource.METRICS = MonitorFormulaAndFunctionMetricQueryDataSource("metrics") diff --git a/src/datadog_api_client/v1/model/monitor_formula_and_function_metric_query_definition.py b/src/datadog_api_client/v1/model/monitor_formula_and_function_metric_query_definition.py new file mode 100644 index 0000000000..466e84def6 --- /dev/null +++ b/src/datadog_api_client/v1/model/monitor_formula_and_function_metric_query_definition.py @@ -0,0 +1,78 @@ +# Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2019-Present Datadog, Inc. +from __future__ import annotations + +from typing import Union, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +if TYPE_CHECKING: + from datadog_api_client.v1.model.monitor_formula_and_function_cost_aggregator import ( + MonitorFormulaAndFunctionCostAggregator, + ) + from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_data_source import ( + MonitorFormulaAndFunctionMetricQueryDataSource, + ) + + +class MonitorFormulaAndFunctionMetricQueryDefinition(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v1.model.monitor_formula_and_function_cost_aggregator import ( + MonitorFormulaAndFunctionCostAggregator, + ) + from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_data_source import ( + MonitorFormulaAndFunctionMetricQueryDataSource, + ) + + return { + "aggregator": (MonitorFormulaAndFunctionCostAggregator,), + "data_source": (MonitorFormulaAndFunctionMetricQueryDataSource,), + "name": (str,), + "query": (str,), + } + + attribute_map = { + "aggregator": "aggregator", + "data_source": "data_source", + "name": "name", + "query": "query", + } + + def __init__( + self_, + data_source: MonitorFormulaAndFunctionMetricQueryDataSource, + name: str, + query: str, + aggregator: Union[MonitorFormulaAndFunctionCostAggregator, UnsetType] = unset, + **kwargs, + ): + """ + A formula and functions metrics query. The ``aggregator`` field is required for ``cost alert`` monitors and not allowed for metric or query alert monitors. + + :param aggregator: Aggregation methods for metric queries. + :type aggregator: MonitorFormulaAndFunctionCostAggregator, optional + + :param data_source: Data source for metrics queries. + :type data_source: MonitorFormulaAndFunctionMetricQueryDataSource + + :param name: Name of the query for use in formulas. + :type name: str + + :param query: The metrics query definition. + :type query: str + """ + if aggregator is not unset: + kwargs["aggregator"] = aggregator + super().__init__(kwargs) + + self_.data_source = data_source + self_.name = name + self_.query = query diff --git a/src/datadog_api_client/v1/model/monitor_formula_and_function_query_definition.py b/src/datadog_api_client/v1/model/monitor_formula_and_function_query_definition.py index 008af69f40..ce4c3bbda6 100644 --- a/src/datadog_api_client/v1/model/monitor_formula_and_function_query_definition.py +++ b/src/datadog_api_client/v1/model/monitor_formula_and_function_query_definition.py @@ -114,6 +114,9 @@ def _composed_schemas(_): from datadog_api_client.v1.model.monitor_formula_and_function_aggregate_filtered_query_definition import ( MonitorFormulaAndFunctionAggregateFilteredQueryDefinition, ) + from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_definition import ( + MonitorFormulaAndFunctionMetricQueryDefinition, + ) return { "oneOf": [ @@ -123,5 +126,6 @@ def _composed_schemas(_): MonitorFormulaAndFunctionDataJobsQueryDefinition, MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition, MonitorFormulaAndFunctionAggregateFilteredQueryDefinition, + MonitorFormulaAndFunctionMetricQueryDefinition, ], } diff --git a/src/datadog_api_client/v1/model/monitor_options.py b/src/datadog_api_client/v1/model/monitor_options.py index d3a3e6b629..217ec07217 100644 --- a/src/datadog_api_client/v1/model/monitor_options.py +++ b/src/datadog_api_client/v1/model/monitor_options.py @@ -44,6 +44,9 @@ from datadog_api_client.v1.model.monitor_formula_and_function_aggregate_filtered_query_definition import ( MonitorFormulaAndFunctionAggregateFilteredQueryDefinition, ) + from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_definition import ( + MonitorFormulaAndFunctionMetricQueryDefinition, + ) class MonitorOptions(ModelNormal): @@ -189,6 +192,7 @@ def __init__( MonitorFormulaAndFunctionDataJobsQueryDefinition, MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition, MonitorFormulaAndFunctionAggregateFilteredQueryDefinition, + MonitorFormulaAndFunctionMetricQueryDefinition, ] ], UnsetType, diff --git a/src/datadog_api_client/v1/models/__init__.py b/src/datadog_api_client/v1/models/__init__.py index cc377e132a..a5576c273b 100644 --- a/src/datadog_api_client/v1/models/__init__.py +++ b/src/datadog_api_client/v1/models/__init__.py @@ -602,6 +602,12 @@ from datadog_api_client.v1.model.monitor_formula_and_function_events_data_source import ( MonitorFormulaAndFunctionEventsDataSource, ) +from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_data_source import ( + MonitorFormulaAndFunctionMetricQueryDataSource, +) +from datadog_api_client.v1.model.monitor_formula_and_function_metric_query_definition import ( + MonitorFormulaAndFunctionMetricQueryDefinition, +) from datadog_api_client.v1.model.monitor_formula_and_function_metrics_aggregator import ( MonitorFormulaAndFunctionMetricsAggregator, ) @@ -2011,6 +2017,8 @@ "MonitorFormulaAndFunctionEventQueryGroupBy", "MonitorFormulaAndFunctionEventQueryGroupBySort", "MonitorFormulaAndFunctionEventsDataSource", + "MonitorFormulaAndFunctionMetricQueryDataSource", + "MonitorFormulaAndFunctionMetricQueryDefinition", "MonitorFormulaAndFunctionMetricsAggregator", "MonitorFormulaAndFunctionMetricsDataSource", "MonitorFormulaAndFunctionMetricsQueryDefinition", diff --git a/tests/generated-test/test-runner-data/manifest.json b/tests/generated-test/test-runner-data/manifest.json index 5b9ff71df7..8142119072 100644 --- a/tests/generated-test/test-runner-data/manifest.json +++ b/tests/generated-test/test-runner-data/manifest.json @@ -1519,6 +1519,13 @@ "scenario": "Create a monitor returns \"OK\" response", "version": "v1" }, + { + "feature": "Monitors", + "feature_file": "../../v1/features/monitors.feature", + "file": "v1/monitors/create-a-monitor-with-a-metrics-formula-variable-returns-ok-response.json", + "scenario": "Create a monitor with a metrics formula variable returns \"OK\" response", + "version": "v1" + }, { "feature": "Monitors", "feature_file": "../../v1/features/monitors.feature", diff --git a/tests/generated-test/test-runner-data/v1/monitors/create-a-monitor-with-a-metrics-formula-variable-returns-ok-response.json b/tests/generated-test/test-runner-data/v1/monitors/create-a-monitor-with-a-metrics-formula-variable-returns-ok-response.json new file mode 100644 index 0000000000..151bac9cc1 --- /dev/null +++ b/tests/generated-test/test-runner-data/v1/monitors/create-a-monitor-with-a-metrics-formula-variable-returns-ok-response.json @@ -0,0 +1,47 @@ +{ + "api": "Monitors", + "expected_status": 200, + "feature": "Monitors", + "id": "v1/Monitors/Create a monitor with a metrics formula variable returns \"OK\" response", + "operation_id": "CreateMonitor", + "request": { + "body": { + "schema": { + "format": null, + "ref": "Monitor", + "type": "object" + }, + "source": "inline", + "value": { + "message": "some message Notify: @hipchat-channel", + "name": "{{ unique }}", + "options": { + "thresholds": { + "critical_query": "formula(\"query1\").rollup(\"p99\").last(\"1w\").multiplier(1.5)" + }, + "variables": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:system.cpu.user{*}" + } + ] + }, + "query": "formula(\"query1\").rollup(\"avg\").last(\"5m\") > threshold", + "tags": [ + "test:{{ unique_lower_alnum }}", + "env:ci" + ], + "type": "query alert" + } + }, + "content_type": "application/json", + "method": "POST", + "pagination": false, + "parameters": [], + "path": "/api/v1/monitor" + }, + "scenario": "Create a monitor with a metrics formula variable returns \"OK\" response", + "schema_version": 1, + "version": "v1" +} diff --git a/tests/generated-test/test-server-data/v1/monitors.json b/tests/generated-test/test-server-data/v1/monitors.json index 67cf00bca5..e057021314 100644 --- a/tests/generated-test/test-server-data/v1/monitors.json +++ b/tests/generated-test/test-server-data/v1/monitors.json @@ -1356,6 +1356,81 @@ "scenario": "Create a monitor returns \"OK\" response", "version": "v1" }, + { + "feature": "Monitors", + "frozen_at": "2026-11-02T16:34:19.974Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "message": "some message Notify: @hipchat-channel", + "name": "Test-Create_a_monitor_with_a_metrics_formula_variable_returns_OK_response-1793637259", + "options": { + "thresholds": { + "critical_query": "formula(\"query1\").rollup(\"p99\").last(\"1w\").multiplier(1.5)" + }, + "variables": [ + { + "data_source": "metrics", + "name": "query1", + "query": "avg:system.cpu.user{*}" + } + ] + }, + "query": "formula(\"query1\").rollup(\"avg\").last(\"5m\") > threshold", + "tags": [ + "test:testcreateamonitorwithametricsformulavariablereturnsokresponse1793637259", + "env:ci" + ], + "type": "query alert" + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v1/monitor", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"id\":339841166,\"org_id\":321813,\"type\":\"metric alert\",\"name\":\"Test-Create_a_monitor_with_a_metrics_formula_variable_returns_OK_response-1793637259\",\"message\":\"some message Notify: @hipchat-channel\",\"tags\":[\"test:testcreateamonitorwithametricsformulavariablereturnsokresponse1793637259\",\"env:ci\"],\"query\":\"formula(\\\"query1\\\").rollup(\\\"avg\\\").last(\\\"5m\\\") > threshold\",\"options\":{\"thresholds\":{\"critical_query\":\"formula(\\\"query1\\\").rollup(\\\"p99\\\").last(\\\"1w\\\").multiplier(1.5)\"},\"variables\":[{\"data_source\":\"metrics\",\"name\":\"query1\",\"query\":\"avg:system.cpu.user{*}\"}],\"notify_no_data\":false,\"notify_audit\":false,\"new_host_delay\":300,\"include_tags\":true,\"silenced\":{}},\"multi\":false,\"created_at\":1793637260000,\"created\":\"2026-11-02T16:34:20.286684+00:00\",\"modified\":\"2026-11-02T16:34:20.286684+00:00\",\"deleted\":null,\"priority\":null,\"restricted_roles\":null,\"restriction_policy\":null,\"draft_status\":\"published\",\"assets\":[],\"overall_state_modified\":null,\"overall_state\":\"No Data\",\"creator\":{\"name\":\"Jasmine Zhang\",\"handle\":\"jasmine.zhang@datadoghq.com\",\"email\":\"jasmine.zhang@datadoghq.com\",\"id\":72175821}}\n" + }, + "headers": { + "content-type": "application/json" + }, + "reason": "OK", + "status": 200 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v1/monitor/339841166", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"deleted_monitor_id\":339841166}\n" + }, + "headers": { + "content-type": "application/json" + }, + "reason": "OK", + "status": 200 + } + } + ], + "scenario": "Create a monitor with a metrics formula variable returns \"OK\" response", + "version": "v1" + }, { "feature": "Monitors", "frozen_at": "2026-03-04T20:59:52.837Z", diff --git a/tests/v1/features/monitors.feature b/tests/v1/features/monitors.feature index fa6affa0f6..e540752e8b 100644 --- a/tests/v1/features/monitors.feature +++ b/tests/v1/features/monitors.feature @@ -183,6 +183,15 @@ Feature: Monitors And the response "type" is equal to "log alert" And the response "query" is equal to "logs(\"service:foo AND type:error\").index(\"main\").rollup(\"count\").by(\"source\").last(\"5m\") > 2" + @team:ddoghq/monitor-app + Scenario: Create a monitor with a metrics formula variable returns "OK" response + Given new "CreateMonitor" request + And body with value {"name": "{{ unique }}", "type": "query alert", "query": "formula(\"query1\").rollup(\"avg\").last(\"5m\") > threshold", "message": "some message Notify: @hipchat-channel", "tags": ["test:{{ unique_lower_alnum }}", "env:ci"], "options": {"thresholds": {"critical_query": "formula(\"query1\").rollup(\"p99\").last(\"1w\").multiplier(1.5)"}, "variables": [{"name": "query1", "data_source": "metrics", "query": "avg:system.cpu.user{*}"}]}} + When the request is sent + Then the response status is 200 OK + And the response "options.variables[0].data_source" is equal to "metrics" + And the response "options.variables[0].name" is equal to "query1" + @team:ddoghq/monitor-app Scenario: Create a monitor with aggregate augmented query variables returns "OK" response Given new "CreateMonitor" request