diff --git a/.apigentools-info b/.apigentools-info index 68ab243286..20974b341c 100644 --- a/.apigentools-info +++ b/.apigentools-info @@ -4,13 +4,13 @@ "spec_versions": { "v1": { "apigentools_version": "1.6.6", - "regenerated": "2025-01-17 21:03:26.896240", - "spec_repo_commit": "617655da" + "regenerated": "2025-01-17 21:41:13.492369", + "spec_repo_commit": "27e609f7" }, "v2": { "apigentools_version": "1.6.6", - "regenerated": "2025-01-17 21:03:26.910869", - "spec_repo_commit": "617655da" + "regenerated": "2025-01-17 21:41:13.506549", + "spec_repo_commit": "27e609f7" } } } \ No newline at end of file diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index 8e9949afea..655dc2c655 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -6784,6 +6784,62 @@ components: - FIREFOX_LAPTOP_LARGE - FIREFOX_TABLET - FIREFOX_MOBILE_SMALL + MonitorFormulaAndFunctionCostAggregator: + description: Aggregation methods for metric queries. + enum: + - avg + - sum + - max + - min + - last + - area + - l2norm + - percentile + - stddev + example: avg + type: string + x-enum-varnames: + - AVG + - SUM + - MAX + - MIN + - LAST + - AREA + - L2NORM + - PERCENTILE + - STDDEV + 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: + description: A formula and functions cost query. + properties: + aggregator: + $ref: '#/components/schemas/MonitorFormulaAndFunctionCostAggregator' + data_source: + $ref: '#/components/schemas/MonitorFormulaAndFunctionCostDataSource' + name: + description: Name of the query for use in formulas. + example: query1 + type: string + query: + description: The monitor query. + example: sum:all.cost{*}.rollup(sum, 86400) + type: string + required: + - name + - data_source + - query + type: object MonitorFormulaAndFunctionEventAggregation: description: Aggregation methods for event platform queries. enum: @@ -6934,6 +6990,7 @@ components: description: A formula and function query. oneOf: - $ref: '#/components/schemas/MonitorFormulaAndFunctionEventQueryDefinition' + - $ref: '#/components/schemas/MonitorFormulaAndFunctionCostQueryDefinition' MonitorGroupSearchResponse: description: The response of a monitor group search. example: diff --git a/docs/datadog_api_client.v1.model.rst b/docs/datadog_api_client.v1.model.rst index fc86ee2cb1..af87c57369 100644 --- a/docs/datadog_api_client.v1.model.rst +++ b/docs/datadog_api_client.v1.model.rst @@ -2027,6 +2027,27 @@ datadog\_api\_client.v1.model.monitor\_device\_id module :members: :show-inheritance: +datadog\_api\_client.v1.model.monitor\_formula\_and\_function\_cost\_aggregator module +-------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.monitor_formula_and_function_cost_aggregator + :members: + :show-inheritance: + +datadog\_api\_client.v1.model.monitor\_formula\_and\_function\_cost\_data\_source module +---------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.monitor_formula_and_function_cost_data_source + :members: + :show-inheritance: + +datadog\_api\_client.v1.model.monitor\_formula\_and\_function\_cost\_query\_definition module +--------------------------------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.monitor_formula_and_function_cost_query_definition + :members: + :show-inheritance: + datadog\_api\_client.v1.model.monitor\_formula\_and\_function\_event\_aggregation module ---------------------------------------------------------------------------------------- diff --git a/examples/v1/monitors/CreateMonitor_1303514967.py b/examples/v1/monitors/CreateMonitor_1303514967.py new file mode 100644 index 0000000000..13e7094317 --- /dev/null +++ b/examples/v1/monitors/CreateMonitor_1303514967.py @@ -0,0 +1,53 @@ +""" +Create a Cost Monitor returns "OK" response +""" + +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_cost_aggregator import ( + MonitorFormulaAndFunctionCostAggregator, +) +from datadog_api_client.v1.model.monitor_formula_and_function_cost_data_source import ( + MonitorFormulaAndFunctionCostDataSource, +) +from datadog_api_client.v1.model.monitor_formula_and_function_cost_query_definition import ( + MonitorFormulaAndFunctionCostQueryDefinition, +) +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.COST_ALERT, + query='formula("exclude_null(query1)").last("7d").anomaly(direction="above", threshold=10) >= 5', + message="some message Notify: @hipchat-channel", + tags=[ + "test:examplemonitor", + "env:ci", + ], + priority=3, + options=MonitorOptions( + thresholds=MonitorThresholds( + critical=5.0, + warning=3.0, + ), + variables=[ + MonitorFormulaAndFunctionCostQueryDefinition( + data_source=MonitorFormulaAndFunctionCostDataSource.CLOUD_COST, + query="sum:aws.cost.net.amortized.shared.resources.allocated{aws_product IN (amplify ,athena, backup, bedrock ) } by {aws_product}.rollup(sum, 86400)", + name="query1", + aggregator=MonitorFormulaAndFunctionCostAggregator.SUM, + ), + ], + include_tags=True, + ), +) + +configuration = Configuration() +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_aggregator.py b/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_aggregator.py new file mode 100644 index 0000000000..7a6c3a2b25 --- /dev/null +++ b/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_aggregator.py @@ -0,0 +1,59 @@ +# 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 MonitorFormulaAndFunctionCostAggregator(ModelSimple): + """ + Aggregation methods for metric queries. + + :param value: Must be one of ["avg", "sum", "max", "min", "last", "area", "l2norm", "percentile", "stddev"]. + :type value: str + """ + + allowed_values = { + "avg", + "sum", + "max", + "min", + "last", + "area", + "l2norm", + "percentile", + "stddev", + } + AVG: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + SUM: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + MAX: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + MIN: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + LAST: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + AREA: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + L2NORM: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + PERCENTILE: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + STDDEV: ClassVar["MonitorFormulaAndFunctionCostAggregator"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +MonitorFormulaAndFunctionCostAggregator.AVG = MonitorFormulaAndFunctionCostAggregator("avg") +MonitorFormulaAndFunctionCostAggregator.SUM = MonitorFormulaAndFunctionCostAggregator("sum") +MonitorFormulaAndFunctionCostAggregator.MAX = MonitorFormulaAndFunctionCostAggregator("max") +MonitorFormulaAndFunctionCostAggregator.MIN = MonitorFormulaAndFunctionCostAggregator("min") +MonitorFormulaAndFunctionCostAggregator.LAST = MonitorFormulaAndFunctionCostAggregator("last") +MonitorFormulaAndFunctionCostAggregator.AREA = MonitorFormulaAndFunctionCostAggregator("area") +MonitorFormulaAndFunctionCostAggregator.L2NORM = MonitorFormulaAndFunctionCostAggregator("l2norm") +MonitorFormulaAndFunctionCostAggregator.PERCENTILE = MonitorFormulaAndFunctionCostAggregator("percentile") +MonitorFormulaAndFunctionCostAggregator.STDDEV = MonitorFormulaAndFunctionCostAggregator("stddev") 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 new file mode 100644 index 0000000000..e3d1cd0d6e --- /dev/null +++ b/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_data_source.py @@ -0,0 +1,41 @@ +# 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 MonitorFormulaAndFunctionCostDataSource(ModelSimple): + """ + Data source for cost queries. + + :param value: Must be one of ["metrics", "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"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +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_cost_query_definition.py b/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_query_definition.py new file mode 100644 index 0000000000..ddb719c20f --- /dev/null +++ b/src/datadog_api_client/v1/model/monitor_formula_and_function_cost_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_cost_data_source import ( + MonitorFormulaAndFunctionCostDataSource, + ) + + +class MonitorFormulaAndFunctionCostQueryDefinition(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_cost_data_source import ( + MonitorFormulaAndFunctionCostDataSource, + ) + + return { + "aggregator": (MonitorFormulaAndFunctionCostAggregator,), + "data_source": (MonitorFormulaAndFunctionCostDataSource,), + "name": (str,), + "query": (str,), + } + + attribute_map = { + "aggregator": "aggregator", + "data_source": "data_source", + "name": "name", + "query": "query", + } + + def __init__( + self_, + data_source: MonitorFormulaAndFunctionCostDataSource, + name: str, + query: str, + aggregator: Union[MonitorFormulaAndFunctionCostAggregator, UnsetType] = unset, + **kwargs, + ): + """ + A formula and functions cost query. + + :param aggregator: Aggregation methods for metric queries. + :type aggregator: MonitorFormulaAndFunctionCostAggregator, optional + + :param data_source: Data source for cost queries. + :type data_source: MonitorFormulaAndFunctionCostDataSource + + :param name: Name of the query for use in formulas. + :type name: str + + :param query: The monitor query. + :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 9362760c17..3e02197ec9 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 @@ -32,6 +32,12 @@ def __init__(self, **kwargs): :param search: Search options. :type search: MonitorFormulaAndFunctionEventQueryDefinitionSearch, optional + + :param aggregator: Aggregation methods for metric queries. + :type aggregator: MonitorFormulaAndFunctionCostAggregator, optional + + :param query: The monitor query. + :type query: str """ super().__init__(kwargs) @@ -47,9 +53,13 @@ def _composed_schemas(_): from datadog_api_client.v1.model.monitor_formula_and_function_event_query_definition import ( MonitorFormulaAndFunctionEventQueryDefinition, ) + from datadog_api_client.v1.model.monitor_formula_and_function_cost_query_definition import ( + MonitorFormulaAndFunctionCostQueryDefinition, + ) return { "oneOf": [ MonitorFormulaAndFunctionEventQueryDefinition, + MonitorFormulaAndFunctionCostQueryDefinition, ], } diff --git a/src/datadog_api_client/v1/model/monitor_options.py b/src/datadog_api_client/v1/model/monitor_options.py index 762dcf1d21..121c1d407f 100644 --- a/src/datadog_api_client/v1/model/monitor_options.py +++ b/src/datadog_api_client/v1/model/monitor_options.py @@ -29,6 +29,9 @@ from datadog_api_client.v1.model.monitor_formula_and_function_event_query_definition import ( MonitorFormulaAndFunctionEventQueryDefinition, ) + from datadog_api_client.v1.model.monitor_formula_and_function_cost_query_definition import ( + MonitorFormulaAndFunctionCostQueryDefinition, + ) class MonitorOptions(ModelNormal): @@ -165,7 +168,13 @@ def __init__( thresholds: Union[MonitorThresholds, UnsetType] = unset, timeout_h: Union[int, none_type, UnsetType] = unset, variables: Union[ - List[Union[MonitorFormulaAndFunctionQueryDefinition, MonitorFormulaAndFunctionEventQueryDefinition]], + List[ + Union[ + MonitorFormulaAndFunctionQueryDefinition, + MonitorFormulaAndFunctionEventQueryDefinition, + MonitorFormulaAndFunctionCostQueryDefinition, + ] + ], UnsetType, ] = unset, **kwargs, diff --git a/src/datadog_api_client/v1/models/__init__.py b/src/datadog_api_client/v1/models/__init__.py index c36e6e760b..a1d98826f1 100644 --- a/src/datadog_api_client/v1/models/__init__.py +++ b/src/datadog_api_client/v1/models/__init__.py @@ -321,6 +321,15 @@ from datadog_api_client.v1.model.metrics_query_unit import MetricsQueryUnit from datadog_api_client.v1.model.monitor import Monitor from datadog_api_client.v1.model.monitor_device_id import MonitorDeviceID +from datadog_api_client.v1.model.monitor_formula_and_function_cost_aggregator import ( + MonitorFormulaAndFunctionCostAggregator, +) +from datadog_api_client.v1.model.monitor_formula_and_function_cost_data_source import ( + MonitorFormulaAndFunctionCostDataSource, +) +from datadog_api_client.v1.model.monitor_formula_and_function_cost_query_definition import ( + MonitorFormulaAndFunctionCostQueryDefinition, +) from datadog_api_client.v1.model.monitor_formula_and_function_event_aggregation import ( MonitorFormulaAndFunctionEventAggregation, ) @@ -1344,6 +1353,9 @@ "MetricsQueryUnit", "Monitor", "MonitorDeviceID", + "MonitorFormulaAndFunctionCostAggregator", + "MonitorFormulaAndFunctionCostDataSource", + "MonitorFormulaAndFunctionCostQueryDefinition", "MonitorFormulaAndFunctionEventAggregation", "MonitorFormulaAndFunctionEventQueryDefinition", "MonitorFormulaAndFunctionEventQueryDefinitionCompute", diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_cost_monitor_returns_ok_response.frozen b/tests/v1/cassettes/test_scenarios/test_create_a_cost_monitor_returns_ok_response.frozen new file mode 100644 index 0000000000..8cea032a9d --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_cost_monitor_returns_ok_response.frozen @@ -0,0 +1 @@ +2025-01-17T11:21:26.452Z \ No newline at end of file diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_cost_monitor_returns_ok_response.yaml b/tests/v1/cassettes/test_scenarios/test_create_a_cost_monitor_returns_ok_response.yaml new file mode 100644 index 0000000000..db1a5cecff --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_cost_monitor_returns_ok_response.yaml @@ -0,0 +1,46 @@ +interactions: +- request: + body: '{"message":"some message Notify: @hipchat-channel","name":"Example Monitor","options":{"include_tags":true,"thresholds":{"critical":5,"warning":3},"variables":[{"aggregator":"sum","data_source":"cloud_cost","name":"query1","query":"sum:aws.cost.net.amortized.shared.resources.allocated{aws_product + IN (amplify ,athena, backup, bedrock ) } by {aws_product}.rollup(sum, 86400)"}]},"priority":3,"query":"formula(\"exclude_null(query1)\").last(\"7d\").anomaly(direction=\"above\", + threshold=10) >= 5","tags":["test:examplemonitor","env:ci"],"type":"cost alert"}' + headers: + accept: + - application/json + content-type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v1/monitor + response: + body: + string: '{"id":162921056,"org_id":321813,"type":"cost alert","name":"Example + Monitor","message":"some message Notify: @hipchat-channel","tags":["test:examplemonitor","env:ci"],"query":"formula(\"exclude_null(query1)\").last(\"7d\").anomaly(direction=\"above\", + threshold=10) >= 5","options":{"include_tags":true,"thresholds":{"critical":5.0,"warning":3.0},"variables":[{"aggregator":"sum","data_source":"cloud_cost","name":"query1","query":"sum:aws.cost.net.amortized.shared.resources.allocated{aws_product + IN (amplify ,athena, backup, bedrock ) } by {aws_product}.rollup(sum, 86400)"}],"notify_no_data":false,"notify_audit":false,"new_host_delay":300,"silenced":{}},"multi":false,"created_at":1737112886000,"created":"2025-01-17T11:21:26.560275+00:00","modified":"2025-01-17T11:21:26.560275+00:00","deleted":null,"priority":3,"restricted_roles":null,"restriction_policy":null,"overall_state_modified":null,"overall_state":"No + Data","creator":{"name":"CI Account","handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","email":"team-intg-tools-libs-spam@datadoghq.com","id":2320499}} + + ' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +- request: + body: null + headers: + accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v1/monitor/162921056 + response: + body: + string: '{"deleted_monitor_id":162921056} + + ' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +version: 1 diff --git a/tests/v1/features/monitors.feature b/tests/v1/features/monitors.feature index 8154cd7a87..bb344afd78 100644 --- a/tests/v1/features/monitors.feature +++ b/tests/v1/features/monitors.feature @@ -33,6 +33,13 @@ Feature: Monitors Then the response status is 200 OK And the response "data.ok[0]" has the same value as "monitor.id" + @team:DataDog/monitor-app + Scenario: Create a Cost Monitor returns "OK" response + Given new "CreateMonitor" request + And body with value {"name": "Example Monitor", "type": "cost alert", "query": "formula(\"exclude_null(query1)\").last(\"7d\").anomaly(direction=\"above\", threshold=10) >= 5", "message": "some message Notify: @hipchat-channel", "tags": ["test:examplemonitor", "env:ci"], "priority": 3, "options": {"thresholds": {"critical": 5, "warning": 3}, "variables": [{"data_source": "cloud_cost", "query": "sum:aws.cost.net.amortized.shared.resources.allocated{aws_product IN (amplify ,athena, backup, bedrock ) } by {aws_product}.rollup(sum, 86400)", "name": "query1", "aggregator": "sum"}], "include_tags": true}} + When the request is sent + Then the response status is 200 OK + @team:DataDog/monitor-app Scenario: Create a RUM formula and functions monitor returns "OK" response Given new "CreateMonitor" request