From e3b222b7e2ef603278e8b36f20cea9e9ac3381a9 Mon Sep 17 00:00:00 2001 From: "ci.datadog-api-spec" Date: Fri, 16 Oct 2026 17:34:08 +0000 Subject: [PATCH] Regenerate client from commit 5555c0e of spec repo --- .generator/schemas/v2/openapi.yaml | 342 ++++++++ examples/v2/metrics/CreateDerivedMetric.py | 40 + examples/v2/metrics/DeleteDerivedMetric.py | 18 + examples/v2/metrics/GetDerivedMetric.py | 20 + examples/v2/metrics/UpdateDerivedMetric.py | 43 + src/datadog_api_client/v2/api/metrics_api.py | 169 ++++ .../v2/model/derived_metric_attributes.py | 40 + .../v2/model/derived_metric_create_data.py | 54 ++ .../v2/model/derived_metric_create_request.py | 40 + .../v2/model/derived_metric_data.py | 54 ++ .../v2/model/derived_metric_definition.py | 52 ++ .../v2/model/derived_metric_query.py | 45 + .../v2/model/derived_metric_response.py | 40 + .../v2/model/derived_metrics_type.py | 35 + src/datadog_api_client/v2/models/__init__.py | 16 + .../test-runner-data/manifest.json | 77 ++ ...d-metric-returns-bad-request-response.json | 43 + ...ived-metric-returns-conflict-response.json | 43 + ...rived-metric-returns-created-response.json | 43 + ...d-metric-returns-bad-request-response.json | 35 + ...ed-metric-returns-no-content-response.json | 35 + ...d-metric-returns-bad-request-response.json | 35 + ...ved-metric-returns-not-found-response.json | 35 + ...-a-derived-metric-returns-ok-response.json | 35 + ...d-metric-returns-bad-request-response.json | 60 ++ ...ved-metric-returns-not-found-response.json | 60 ++ ...-a-derived-metric-returns-ok-response.json | 60 ++ .../test-server-data/v2/metrics.json | 792 +++++++++++++++++- tests/v2/features/given.json | 12 + tests/v2/features/metrics.feature | 111 +++ tests/v2/features/undo.json | 31 + 31 files changed, 2472 insertions(+), 43 deletions(-) create mode 100644 examples/v2/metrics/CreateDerivedMetric.py create mode 100644 examples/v2/metrics/DeleteDerivedMetric.py create mode 100644 examples/v2/metrics/GetDerivedMetric.py create mode 100644 examples/v2/metrics/UpdateDerivedMetric.py create mode 100644 src/datadog_api_client/v2/model/derived_metric_attributes.py create mode 100644 src/datadog_api_client/v2/model/derived_metric_create_data.py create mode 100644 src/datadog_api_client/v2/model/derived_metric_create_request.py create mode 100644 src/datadog_api_client/v2/model/derived_metric_data.py create mode 100644 src/datadog_api_client/v2/model/derived_metric_definition.py create mode 100644 src/datadog_api_client/v2/model/derived_metric_query.py create mode 100644 src/datadog_api_client/v2/model/derived_metric_response.py create mode 100644 src/datadog_api_client/v2/model/derived_metrics_type.py create mode 100644 tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-bad-request-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-conflict-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-created-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-bad-request-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-no-content-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-bad-request-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-not-found-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-ok-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-bad-request-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-not-found-response.json create mode 100644 tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-ok-response.json diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 8e540e2cff..10cbce5a5e 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -36727,6 +36727,109 @@ components: - $ref: "#/components/schemas/DeploymentRuleOptionsFaultyDeploymentDetection" - $ref: "#/components/schemas/DeploymentRuleOptionsMonitor" - $ref: "#/components/schemas/DeploymentRuleOptionsMonitorIds" + DerivedMetricAttributes: + description: Attributes of a derived metric. + properties: + definition: + $ref: "#/components/schemas/DerivedMetricDefinition" + required: + - definition + type: object + DerivedMetricCreateData: + description: Data object for creating or updating a derived metric. + properties: + attributes: + $ref: "#/components/schemas/DerivedMetricAttributes" + id: + description: The derived metric name used as the resource ID. + example: my.derived.metric + type: string + type: + $ref: "#/components/schemas/DerivedMetricsType" + required: + - id + - type + - attributes + type: object + DerivedMetricCreateRequest: + description: Request body for creating or updating a derived metric. + properties: + data: + $ref: "#/components/schemas/DerivedMetricCreateData" + required: + - data + type: object + DerivedMetricData: + description: A derived metric resource object. + properties: + attributes: + $ref: "#/components/schemas/DerivedMetricAttributes" + id: + description: The derived metric name used as the resource ID. + example: my.derived.metric + type: string + type: + $ref: "#/components/schemas/DerivedMetricsType" + required: + - id + - type + - attributes + type: object + DerivedMetricDefinition: + description: The definition of a derived metric as a formula over one or more queries. + properties: + formula: + description: The formula that combines the queries into the value of the derived metric. + example: a + type: string + queries: + description: The list of queries referenced by the formula. + items: + $ref: "#/components/schemas/DerivedMetricQuery" + minItems: 1 + type: array + required: + - formula + - queries + type: object + DerivedMetricQuery: + description: A single query used in the definition of a derived metric. + properties: + data_source: + description: The data source that the query is run against. + example: metrics + type: string + name: + description: The name used to reference this query from the formula. + example: a + type: string + query: + description: The query string executed against the data source. + example: avg:system.cpu.user{*} + type: string + required: + - data_source + - name + - query + type: object + DerivedMetricResponse: + description: Response containing a single derived metric. + properties: + data: + $ref: "#/components/schemas/DerivedMetricData" + readOnly: true + required: + - data + type: object + DerivedMetricsType: + default: derived_metrics + description: The derived metric resource type. + enum: + - derived_metrics + example: derived_metrics + type: string + x-enum-varnames: + - DERIVED_METRICS DetachCaseRequest: description: Request for detaching security findings from their case. properties: @@ -198072,6 +198175,245 @@ paths: permissions: - metric_tags_write x-sunset: "2027-01-01" + /api/v2/metrics/derived-metrics: + post: + description: |- + Create a derived metric for the org. The metric name is supplied as the resource `id`, + and the `definition` sets the formula and the queries the formula is computed from. + Requires the `Manage Tags for Metrics` permission. + operationId: CreateDerivedMetric + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + definition: + formula: a + queries: + - data_source: metrics + name: a + query: avg:system.cpu.user{*} + id: my.derived.metric + type: derived_metrics + schema: + $ref: "#/components/schemas/DerivedMetricCreateRequest" + required: true + responses: + "201": + content: + application/json: + examples: + default: + value: + data: + attributes: + definition: + formula: a + queries: + - data_source: metrics + name: a + query: avg:system.cpu.user{*} + id: my.derived.metric + type: derived_metrics + schema: + $ref: "#/components/schemas/DerivedMetricResponse" + description: Created + headers: + Location: + description: The URL of the newly created derived metric. + schema: + type: string + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Bad Request + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Forbidden + "409": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Conflict + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: + - metric_tags_write + summary: Create a derived metric + tags: + - Metrics + x-codegen-request-body-name: body + "x-permission": + operator: OR + permissions: + - metric_tags_write + /api/v2/metrics/derived-metrics/{metric_name}: + delete: + description: |- + Delete a derived metric by name. Idempotent: returns 204 regardless of whether the derived + metric existed. Requires the `Manage Tags for Metrics` permission. + operationId: DeleteDerivedMetric + parameters: + - $ref: "#/components/parameters/MetricName" + responses: + "204": + description: No Content + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Bad Request + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: + - metric_tags_write + summary: Delete a derived metric + tags: + - Metrics + "x-permission": + operator: OR + permissions: + - metric_tags_write + get: + description: Get the definition of a derived metric by name. + operationId: GetDerivedMetric + parameters: + - $ref: "#/components/parameters/MetricName" + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + definition: + formula: a + queries: + - data_source: metrics + name: a + query: avg:system.cpu.user{*} + id: my.derived.metric + type: derived_metrics + schema: + $ref: "#/components/schemas/DerivedMetricResponse" + description: OK + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Bad Request + "404": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Not Found + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: + - metrics_read + summary: Get a derived metric + tags: + - Metrics + "x-permission": + operator: OR + permissions: + - metrics_read + put: + description: |- + Update the definition of an existing derived metric. The `id` in the request body + must match the `metric_name` path parameter. Requires the `Manage Tags for Metrics` permission. + operationId: UpdateDerivedMetric + parameters: + - $ref: "#/components/parameters/MetricName" + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + definition: + formula: a + queries: + - data_source: metrics + name: a + query: avg:system.cpu.user{*} + id: my.derived.metric + type: derived_metrics + schema: + $ref: "#/components/schemas/DerivedMetricCreateRequest" + required: true + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + attributes: + definition: + formula: a + queries: + - data_source: metrics + name: a + query: avg:system.cpu.user{*} + id: my.derived.metric + type: derived_metrics + schema: + $ref: "#/components/schemas/DerivedMetricResponse" + description: OK + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Bad Request + "404": + content: + application/json: + schema: + $ref: "#/components/schemas/APIErrorResponse" + description: Not Found + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + - AuthZ: + - metric_tags_write + summary: Update a derived metric + tags: + - Metrics + x-codegen-request-body-name: body + "x-permission": + operator: OR + permissions: + - metric_tags_write /api/v2/metrics/historical-metrics-configurations: post: description: |- diff --git a/examples/v2/metrics/CreateDerivedMetric.py b/examples/v2/metrics/CreateDerivedMetric.py new file mode 100644 index 0000000000..c8fdd91003 --- /dev/null +++ b/examples/v2/metrics/CreateDerivedMetric.py @@ -0,0 +1,40 @@ +""" +Create a derived metric returns "Created" response +""" + +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.metrics_api import MetricsApi +from datadog_api_client.v2.model.derived_metric_attributes import DerivedMetricAttributes +from datadog_api_client.v2.model.derived_metric_create_data import DerivedMetricCreateData +from datadog_api_client.v2.model.derived_metric_create_request import DerivedMetricCreateRequest +from datadog_api_client.v2.model.derived_metric_definition import DerivedMetricDefinition +from datadog_api_client.v2.model.derived_metric_query import DerivedMetricQuery +from datadog_api_client.v2.model.derived_metrics_type import DerivedMetricsType + +body = DerivedMetricCreateRequest( + data=DerivedMetricCreateData( + attributes=DerivedMetricAttributes( + definition=DerivedMetricDefinition( + formula="a", + queries=[ + DerivedMetricQuery( + data_source="metrics", + name="a", + query="avg:system.cpu.user{*}", + ), + ], + ), + ), + id="test.derived.examplemetric", + type=DerivedMetricsType.DERIVED_METRICS, + ), +) + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = MetricsApi(api_client) + response = api_instance.create_derived_metric(body=body) + + print(response) diff --git a/examples/v2/metrics/DeleteDerivedMetric.py b/examples/v2/metrics/DeleteDerivedMetric.py new file mode 100644 index 0000000000..93193d8d50 --- /dev/null +++ b/examples/v2/metrics/DeleteDerivedMetric.py @@ -0,0 +1,18 @@ +""" +Delete a derived metric returns "No Content" response +""" + +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.metrics_api import MetricsApi + +# there is a valid "derived_metric" in the system +DERIVED_METRIC_DATA_ID = environ["DERIVED_METRIC_DATA_ID"] + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = MetricsApi(api_client) + api_instance.delete_derived_metric( + metric_name=DERIVED_METRIC_DATA_ID, + ) diff --git a/examples/v2/metrics/GetDerivedMetric.py b/examples/v2/metrics/GetDerivedMetric.py new file mode 100644 index 0000000000..3867fbd793 --- /dev/null +++ b/examples/v2/metrics/GetDerivedMetric.py @@ -0,0 +1,20 @@ +""" +Get a derived metric returns "OK" response +""" + +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.metrics_api import MetricsApi + +# there is a valid "derived_metric" in the system +DERIVED_METRIC_DATA_ID = environ["DERIVED_METRIC_DATA_ID"] + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = MetricsApi(api_client) + response = api_instance.get_derived_metric( + metric_name=DERIVED_METRIC_DATA_ID, + ) + + print(response) diff --git a/examples/v2/metrics/UpdateDerivedMetric.py b/examples/v2/metrics/UpdateDerivedMetric.py new file mode 100644 index 0000000000..89c492b56d --- /dev/null +++ b/examples/v2/metrics/UpdateDerivedMetric.py @@ -0,0 +1,43 @@ +""" +Update a derived metric returns "OK" response +""" + +from os import environ +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v2.api.metrics_api import MetricsApi +from datadog_api_client.v2.model.derived_metric_attributes import DerivedMetricAttributes +from datadog_api_client.v2.model.derived_metric_create_data import DerivedMetricCreateData +from datadog_api_client.v2.model.derived_metric_create_request import DerivedMetricCreateRequest +from datadog_api_client.v2.model.derived_metric_definition import DerivedMetricDefinition +from datadog_api_client.v2.model.derived_metric_query import DerivedMetricQuery +from datadog_api_client.v2.model.derived_metrics_type import DerivedMetricsType + +# there is a valid "derived_metric" in the system +DERIVED_METRIC_DATA_ID = environ["DERIVED_METRIC_DATA_ID"] + +body = DerivedMetricCreateRequest( + data=DerivedMetricCreateData( + attributes=DerivedMetricAttributes( + definition=DerivedMetricDefinition( + formula="a * 2", + queries=[ + DerivedMetricQuery( + data_source="metrics", + name="a", + query="avg:system.cpu.user{*}", + ), + ], + ), + ), + id=DERIVED_METRIC_DATA_ID, + type=DerivedMetricsType.DERIVED_METRICS, + ), +) + +configuration = Configuration() +configuration.access_token = environ["DD_BEARER_TOKEN"] +with ApiClient(configuration) as api_client: + api_instance = MetricsApi(api_client) + response = api_instance.update_derived_metric(metric_name=DERIVED_METRIC_DATA_ID, body=body) + + print(response) diff --git a/src/datadog_api_client/v2/api/metrics_api.py b/src/datadog_api_client/v2/api/metrics_api.py index cefde7f960..9ed514a287 100644 --- a/src/datadog_api_client/v2/api/metrics_api.py +++ b/src/datadog_api_client/v2/api/metrics_api.py @@ -25,6 +25,8 @@ from datadog_api_client.v2.model.metric_bulk_tag_config_response import MetricBulkTagConfigResponse from datadog_api_client.v2.model.metric_bulk_tag_config_delete_request import MetricBulkTagConfigDeleteRequest from datadog_api_client.v2.model.metric_bulk_tag_config_create_request import MetricBulkTagConfigCreateRequest +from datadog_api_client.v2.model.derived_metric_response import DerivedMetricResponse +from datadog_api_client.v2.model.derived_metric_create_request import DerivedMetricCreateRequest from datadog_api_client.v2.model.historical_metrics_configuration_response import HistoricalMetricsConfigurationResponse from datadog_api_client.v2.model.historical_metrics_configuration_create_request import ( HistoricalMetricsConfigurationCreateRequest, @@ -100,6 +102,26 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._create_derived_metric_endpoint = _Endpoint( + settings={ + "response_type": (DerivedMetricResponse,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/metrics/derived-metrics", + "operation_id": "create_derived_metric", + "http_method": "POST", + "version": "v2", + }, + params_map={ + "body": { + "required": True, + "openapi_types": (DerivedMetricCreateRequest,), + "location": "body", + }, + }, + headers_map={"accept": ["application/json"], "content_type": ["application/json"]}, + api_client=api_client, + ) + self._create_historical_metrics_configuration_endpoint = _Endpoint( settings={ "response_type": (HistoricalMetricsConfigurationResponse,), @@ -212,6 +234,29 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._delete_derived_metric_endpoint = _Endpoint( + settings={ + "response_type": None, + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/metrics/derived-metrics/{metric_name}", + "operation_id": "delete_derived_metric", + "http_method": "DELETE", + "version": "v2", + }, + params_map={ + "metric_name": { + "required": True, + "openapi_types": (str,), + "attribute": "metric_name", + "location": "path", + }, + }, + headers_map={ + "accept": ["*/*"], + }, + api_client=api_client, + ) + self._delete_historical_metrics_configuration_endpoint = _Endpoint( settings={ "response_type": None, @@ -367,6 +412,29 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._get_derived_metric_endpoint = _Endpoint( + settings={ + "response_type": (DerivedMetricResponse,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/metrics/derived-metrics/{metric_name}", + "operation_id": "get_derived_metric", + "http_method": "GET", + "version": "v2", + }, + params_map={ + "metric_name": { + "required": True, + "openapi_types": (str,), + "attribute": "metric_name", + "location": "path", + }, + }, + headers_map={ + "accept": ["application/json"], + }, + api_client=api_client, + ) + self._get_historical_metrics_configuration_endpoint = _Endpoint( settings={ "response_type": (HistoricalMetricsConfigurationResponse,), @@ -857,6 +925,32 @@ def __init__(self, api_client=None): api_client=api_client, ) + self._update_derived_metric_endpoint = _Endpoint( + settings={ + "response_type": (DerivedMetricResponse,), + "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"], + "endpoint_path": "/api/v2/metrics/derived-metrics/{metric_name}", + "operation_id": "update_derived_metric", + "http_method": "PUT", + "version": "v2", + }, + params_map={ + "metric_name": { + "required": True, + "openapi_types": (str,), + "attribute": "metric_name", + "location": "path", + }, + "body": { + "required": True, + "openapi_types": (DerivedMetricCreateRequest,), + "location": "body", + }, + }, + headers_map={"accept": ["application/json"], "content_type": ["application/json"]}, + api_client=api_client, + ) + self._update_tag_configuration_endpoint = _Endpoint( settings={ "response_type": (MetricTagConfigurationResponse,), @@ -934,6 +1028,24 @@ def create_bulk_tags_metrics_configuration( warnings.warn("create_bulk_tags_metrics_configuration is deprecated", DeprecationWarning, stacklevel=2) return self._create_bulk_tags_metrics_configuration_endpoint.call_with_http_info(**kwargs) + def create_derived_metric( + self, + body: DerivedMetricCreateRequest, + ) -> DerivedMetricResponse: + """Create a derived metric. + + Create a derived metric for the org. The metric name is supplied as the resource ``id`` , + and the ``definition`` sets the formula and the queries the formula is computed from. + Requires the ``Manage Tags for Metrics`` permission. + + :type body: DerivedMetricCreateRequest + :rtype: DerivedMetricResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["body"] = body + + return self._create_derived_metric_endpoint.call_with_http_info(**kwargs) + def create_historical_metrics_configuration( self, body: HistoricalMetricsConfigurationCreateRequest, @@ -1040,6 +1152,24 @@ def delete_bulk_tags_metrics_configuration( warnings.warn("delete_bulk_tags_metrics_configuration is deprecated", DeprecationWarning, stacklevel=2) return self._delete_bulk_tags_metrics_configuration_endpoint.call_with_http_info(**kwargs) + def delete_derived_metric( + self, + metric_name: str, + ) -> None: + """Delete a derived metric. + + Delete a derived metric by name. Idempotent: returns 204 regardless of whether the derived + metric existed. Requires the ``Manage Tags for Metrics`` permission. + + :param metric_name: The name of the metric. + :type metric_name: str + :rtype: None + """ + kwargs: Dict[str, Any] = {} + kwargs["metric_name"] = metric_name + + return self._delete_derived_metric_endpoint.call_with_http_info(**kwargs) + def delete_historical_metrics_configuration( self, metric_name: str, @@ -1170,6 +1300,23 @@ def estimate_metrics_output_series( return self._estimate_metrics_output_series_endpoint.call_with_http_info(**kwargs) + def get_derived_metric( + self, + metric_name: str, + ) -> DerivedMetricResponse: + """Get a derived metric. + + Get the definition of a derived metric by name. + + :param metric_name: The name of the metric. + :type metric_name: str + :rtype: DerivedMetricResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["metric_name"] = metric_name + + return self._get_derived_metric_endpoint.call_with_http_info(**kwargs) + def get_historical_metrics_configuration( self, metric_name: str, @@ -1741,6 +1888,28 @@ def submit_metrics( return self._submit_metrics_endpoint.call_with_http_info(**kwargs) + def update_derived_metric( + self, + metric_name: str, + body: DerivedMetricCreateRequest, + ) -> DerivedMetricResponse: + """Update a derived metric. + + Update the definition of an existing derived metric. The ``id`` in the request body + must match the ``metric_name`` path parameter. Requires the ``Manage Tags for Metrics`` permission. + + :param metric_name: The name of the metric. + :type metric_name: str + :type body: DerivedMetricCreateRequest + :rtype: DerivedMetricResponse + """ + kwargs: Dict[str, Any] = {} + kwargs["metric_name"] = metric_name + + kwargs["body"] = body + + return self._update_derived_metric_endpoint.call_with_http_info(**kwargs) + def update_tag_configuration( self, metric_name: str, diff --git a/src/datadog_api_client/v2/model/derived_metric_attributes.py b/src/datadog_api_client/v2/model/derived_metric_attributes.py new file mode 100644 index 0000000000..95a3792133 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metric_attributes.py @@ -0,0 +1,40 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.derived_metric_definition import DerivedMetricDefinition + + +class DerivedMetricAttributes(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.derived_metric_definition import DerivedMetricDefinition + + return { + "definition": (DerivedMetricDefinition,), + } + + attribute_map = { + "definition": "definition", + } + + def __init__(self_, definition: DerivedMetricDefinition, **kwargs): + """ + Attributes of a derived metric. + + :param definition: The definition of a derived metric as a formula over one or more queries. + :type definition: DerivedMetricDefinition + """ + super().__init__(kwargs) + + self_.definition = definition diff --git a/src/datadog_api_client/v2/model/derived_metric_create_data.py b/src/datadog_api_client/v2/model/derived_metric_create_data.py new file mode 100644 index 0000000000..874b007379 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metric_create_data.py @@ -0,0 +1,54 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.derived_metric_attributes import DerivedMetricAttributes + from datadog_api_client.v2.model.derived_metrics_type import DerivedMetricsType + + +class DerivedMetricCreateData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.derived_metric_attributes import DerivedMetricAttributes + from datadog_api_client.v2.model.derived_metrics_type import DerivedMetricsType + + return { + "attributes": (DerivedMetricAttributes,), + "id": (str,), + "type": (DerivedMetricsType,), + } + + attribute_map = { + "attributes": "attributes", + "id": "id", + "type": "type", + } + + def __init__(self_, attributes: DerivedMetricAttributes, id: str, type: DerivedMetricsType, **kwargs): + """ + Data object for creating or updating a derived metric. + + :param attributes: Attributes of a derived metric. + :type attributes: DerivedMetricAttributes + + :param id: The derived metric name used as the resource ID. + :type id: str + + :param type: The derived metric resource type. + :type type: DerivedMetricsType + """ + super().__init__(kwargs) + + self_.attributes = attributes + self_.id = id + self_.type = type diff --git a/src/datadog_api_client/v2/model/derived_metric_create_request.py b/src/datadog_api_client/v2/model/derived_metric_create_request.py new file mode 100644 index 0000000000..8d620b6d79 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metric_create_request.py @@ -0,0 +1,40 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.derived_metric_create_data import DerivedMetricCreateData + + +class DerivedMetricCreateRequest(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.derived_metric_create_data import DerivedMetricCreateData + + return { + "data": (DerivedMetricCreateData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: DerivedMetricCreateData, **kwargs): + """ + Request body for creating or updating a derived metric. + + :param data: Data object for creating or updating a derived metric. + :type data: DerivedMetricCreateData + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/derived_metric_data.py b/src/datadog_api_client/v2/model/derived_metric_data.py new file mode 100644 index 0000000000..2da317f6d0 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metric_data.py @@ -0,0 +1,54 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.derived_metric_attributes import DerivedMetricAttributes + from datadog_api_client.v2.model.derived_metrics_type import DerivedMetricsType + + +class DerivedMetricData(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.derived_metric_attributes import DerivedMetricAttributes + from datadog_api_client.v2.model.derived_metrics_type import DerivedMetricsType + + return { + "attributes": (DerivedMetricAttributes,), + "id": (str,), + "type": (DerivedMetricsType,), + } + + attribute_map = { + "attributes": "attributes", + "id": "id", + "type": "type", + } + + def __init__(self_, attributes: DerivedMetricAttributes, id: str, type: DerivedMetricsType, **kwargs): + """ + A derived metric resource object. + + :param attributes: Attributes of a derived metric. + :type attributes: DerivedMetricAttributes + + :param id: The derived metric name used as the resource ID. + :type id: str + + :param type: The derived metric resource type. + :type type: DerivedMetricsType + """ + super().__init__(kwargs) + + self_.attributes = attributes + self_.id = id + self_.type = type diff --git a/src/datadog_api_client/v2/model/derived_metric_definition.py b/src/datadog_api_client/v2/model/derived_metric_definition.py new file mode 100644 index 0000000000..3eafe4d132 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metric_definition.py @@ -0,0 +1,52 @@ +# 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 List, TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.derived_metric_query import DerivedMetricQuery + + +class DerivedMetricDefinition(ModelNormal): + validations = { + "queries": { + "min_items": 1, + }, + } + + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.derived_metric_query import DerivedMetricQuery + + return { + "formula": (str,), + "queries": ([DerivedMetricQuery],), + } + + attribute_map = { + "formula": "formula", + "queries": "queries", + } + + def __init__(self_, formula: str, queries: List[DerivedMetricQuery], **kwargs): + """ + The definition of a derived metric as a formula over one or more queries. + + :param formula: The formula that combines the queries into the value of the derived metric. + :type formula: str + + :param queries: The list of queries referenced by the formula. + :type queries: [DerivedMetricQuery] + """ + super().__init__(kwargs) + + self_.formula = formula + self_.queries = queries diff --git a/src/datadog_api_client/v2/model/derived_metric_query.py b/src/datadog_api_client/v2/model/derived_metric_query.py new file mode 100644 index 0000000000..2214df0533 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metric_query.py @@ -0,0 +1,45 @@ +# 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 ( + ModelNormal, + cached_property, +) + + +class DerivedMetricQuery(ModelNormal): + @cached_property + def openapi_types(_): + return { + "data_source": (str,), + "name": (str,), + "query": (str,), + } + + attribute_map = { + "data_source": "data_source", + "name": "name", + "query": "query", + } + + def __init__(self_, data_source: str, name: str, query: str, **kwargs): + """ + A single query used in the definition of a derived metric. + + :param data_source: The data source that the query is run against. + :type data_source: str + + :param name: The name used to reference this query from the formula. + :type name: str + + :param query: The query string executed against the data source. + :type query: str + """ + super().__init__(kwargs) + + self_.data_source = data_source + self_.name = name + self_.query = query diff --git a/src/datadog_api_client/v2/model/derived_metric_response.py b/src/datadog_api_client/v2/model/derived_metric_response.py new file mode 100644 index 0000000000..7200034b45 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metric_response.py @@ -0,0 +1,40 @@ +# 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 TYPE_CHECKING + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, +) + + +if TYPE_CHECKING: + from datadog_api_client.v2.model.derived_metric_data import DerivedMetricData + + +class DerivedMetricResponse(ModelNormal): + @cached_property + def openapi_types(_): + from datadog_api_client.v2.model.derived_metric_data import DerivedMetricData + + return { + "data": (DerivedMetricData,), + } + + attribute_map = { + "data": "data", + } + + def __init__(self_, data: DerivedMetricData, **kwargs): + """ + Response containing a single derived metric. + + :param data: A derived metric resource object. + :type data: DerivedMetricData + """ + super().__init__(kwargs) + + self_.data = data diff --git a/src/datadog_api_client/v2/model/derived_metrics_type.py b/src/datadog_api_client/v2/model/derived_metrics_type.py new file mode 100644 index 0000000000..fe25b7aee0 --- /dev/null +++ b/src/datadog_api_client/v2/model/derived_metrics_type.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 DerivedMetricsType(ModelSimple): + """ + The derived metric resource type. + + :param value: If omitted defaults to "derived_metrics". Must be one of ["derived_metrics"]. + :type value: str + """ + + allowed_values = { + "derived_metrics", + } + DERIVED_METRICS: ClassVar["DerivedMetricsType"] + + @cached_property + def openapi_types(_): + return { + "value": (str,), + } + + +DerivedMetricsType.DERIVED_METRICS = DerivedMetricsType("derived_metrics") diff --git a/src/datadog_api_client/v2/models/__init__.py b/src/datadog_api_client/v2/models/__init__.py index a2e4ddb291..089874c5bc 100644 --- a/src/datadog_api_client/v2/models/__init__.py +++ b/src/datadog_api_client/v2/models/__init__.py @@ -2813,6 +2813,14 @@ DeploymentRuleResponseDataAttributesUpdatedBy, ) from datadog_api_client.v2.model.deployment_rules_options import DeploymentRulesOptions +from datadog_api_client.v2.model.derived_metric_attributes import DerivedMetricAttributes +from datadog_api_client.v2.model.derived_metric_create_data import DerivedMetricCreateData +from datadog_api_client.v2.model.derived_metric_create_request import DerivedMetricCreateRequest +from datadog_api_client.v2.model.derived_metric_data import DerivedMetricData +from datadog_api_client.v2.model.derived_metric_definition import DerivedMetricDefinition +from datadog_api_client.v2.model.derived_metric_query import DerivedMetricQuery +from datadog_api_client.v2.model.derived_metric_response import DerivedMetricResponse +from datadog_api_client.v2.model.derived_metrics_type import DerivedMetricsType from datadog_api_client.v2.model.detach_case_request import DetachCaseRequest from datadog_api_client.v2.model.detach_case_request_data import DetachCaseRequestData from datadog_api_client.v2.model.detach_case_request_data_relationships import DetachCaseRequestDataRelationships @@ -14767,6 +14775,14 @@ "DeploymentRuleResponseDataAttributesType", "DeploymentRuleResponseDataAttributesUpdatedBy", "DeploymentRulesOptions", + "DerivedMetricAttributes", + "DerivedMetricCreateData", + "DerivedMetricCreateRequest", + "DerivedMetricData", + "DerivedMetricDefinition", + "DerivedMetricQuery", + "DerivedMetricResponse", + "DerivedMetricsType", "DetachCaseRequest", "DetachCaseRequestData", "DetachCaseRequestDataRelationships", diff --git a/tests/generated-test/test-runner-data/manifest.json b/tests/generated-test/test-runner-data/manifest.json index ae6bce3fe3..6f6950add3 100644 --- a/tests/generated-test/test-runner-data/manifest.json +++ b/tests/generated-test/test-runner-data/manifest.json @@ -7273,6 +7273,27 @@ "scenario": "Configure tags for multiple metrics returns \"Accepted\" response", "version": "v2" }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/create-a-derived-metric-returns-bad-request-response.json", + "scenario": "Create a derived metric returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/create-a-derived-metric-returns-conflict-response.json", + "scenario": "Create a derived metric returns \"Conflict\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/create-a-derived-metric-returns-created-response.json", + "scenario": "Create a derived metric returns \"Created\" response", + "version": "v2" + }, { "feature": "Metrics", "feature_file": "../../v2/features/metrics.feature", @@ -7315,6 +7336,20 @@ "scenario": "Create a tag indexing rule with exclude_not_used_in_assets and exclude_tags_mode false returns \"Bad Request\" response", "version": "v2" }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/delete-a-derived-metric-returns-bad-request-response.json", + "scenario": "Delete a derived metric returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/delete-a-derived-metric-returns-no-content-response.json", + "scenario": "Delete a derived metric returns \"No Content\" response", + "version": "v2" + }, { "feature": "Metrics", "feature_file": "../../v2/features/metrics.feature", @@ -7336,6 +7371,27 @@ "scenario": "Delete a tag indexing rule returns \"No Content\" response", "version": "v2" }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/get-a-derived-metric-returns-bad-request-response.json", + "scenario": "Get a derived metric returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/get-a-derived-metric-returns-not-found-response.json", + "scenario": "Get a derived metric returns \"Not Found\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/get-a-derived-metric-returns-ok-response.json", + "scenario": "Get a derived metric returns \"OK\" response", + "version": "v2" + }, { "feature": "Metrics", "feature_file": "../../v2/features/metrics.feature", @@ -7756,6 +7812,27 @@ "scenario": "Timeseries cross product query with spans data source returns \"OK\" response", "version": "v2" }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/update-a-derived-metric-returns-bad-request-response.json", + "scenario": "Update a derived metric returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/update-a-derived-metric-returns-not-found-response.json", + "scenario": "Update a derived metric returns \"Not Found\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "feature_file": "../../v2/features/metrics.feature", + "file": "v2/metrics/update-a-derived-metric-returns-ok-response.json", + "scenario": "Update a derived metric returns \"OK\" response", + "version": "v2" + }, { "feature": "Metrics", "feature_file": "../../v2/features/metrics.feature", diff --git a/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-bad-request-response.json b/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-bad-request-response.json new file mode 100644 index 0000000000..34328a1a83 --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-bad-request-response.json @@ -0,0 +1,43 @@ +{ + "api": "Metrics", + "expected_status": 400, + "feature": "Metrics", + "id": "v2/Metrics/Create a derived metric returns \"Bad Request\" response", + "operation_id": "CreateDerivedMetric", + "request": { + "body": { + "schema": { + "format": null, + "ref": "DerivedMetricCreateRequest", + "type": "object" + }, + "source": "inline", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "1invalid.metric", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "pagination": false, + "parameters": [], + "path": "/api/v2/metrics/derived-metrics" + }, + "scenario": "Create a derived metric returns \"Bad Request\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-conflict-response.json b/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-conflict-response.json new file mode 100644 index 0000000000..4c025dbe1e --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-conflict-response.json @@ -0,0 +1,43 @@ +{ + "api": "Metrics", + "expected_status": 409, + "feature": "Metrics", + "id": "v2/Metrics/Create a derived metric returns \"Conflict\" response", + "operation_id": "CreateDerivedMetric", + "request": { + "body": { + "schema": { + "format": null, + "ref": "DerivedMetricCreateRequest", + "type": "object" + }, + "source": "inline", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "{{ derived_metric.data.id }}", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "pagination": false, + "parameters": [], + "path": "/api/v2/metrics/derived-metrics" + }, + "scenario": "Create a derived metric returns \"Conflict\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-created-response.json b/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-created-response.json new file mode 100644 index 0000000000..cd8103cfcd --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/create-a-derived-metric-returns-created-response.json @@ -0,0 +1,43 @@ +{ + "api": "Metrics", + "expected_status": 201, + "feature": "Metrics", + "id": "v2/Metrics/Create a derived metric returns \"Created\" response", + "operation_id": "CreateDerivedMetric", + "request": { + "body": { + "schema": { + "format": null, + "ref": "DerivedMetricCreateRequest", + "type": "object" + }, + "source": "inline", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.{{ unique_lower_alnum }}", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "pagination": false, + "parameters": [], + "path": "/api/v2/metrics/derived-metrics" + }, + "scenario": "Create a derived metric returns \"Created\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-bad-request-response.json b/tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-bad-request-response.json new file mode 100644 index 0000000000..5be957f740 --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-bad-request-response.json @@ -0,0 +1,35 @@ +{ + "api": "Metrics", + "expected_status": 400, + "feature": "Metrics", + "id": "v2/Metrics/Delete a derived metric returns \"Bad Request\" response", + "operation_id": "DeleteDerivedMetric", + "request": { + "body": null, + "content_type": null, + "method": "DELETE", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "type": "literal", + "value": "1invalid.metric" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Delete a derived metric returns \"Bad Request\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-no-content-response.json b/tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-no-content-response.json new file mode 100644 index 0000000000..11042c6cf9 --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/delete-a-derived-metric-returns-no-content-response.json @@ -0,0 +1,35 @@ +{ + "api": "Metrics", + "expected_status": 204, + "feature": "Metrics", + "id": "v2/Metrics/Delete a derived metric returns \"No Content\" response", + "operation_id": "DeleteDerivedMetric", + "request": { + "body": null, + "content_type": null, + "method": "DELETE", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "path": "derived_metric.data.id", + "type": "fixture" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Delete a derived metric returns \"No Content\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-bad-request-response.json b/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-bad-request-response.json new file mode 100644 index 0000000000..8db0a25188 --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-bad-request-response.json @@ -0,0 +1,35 @@ +{ + "api": "Metrics", + "expected_status": 400, + "feature": "Metrics", + "id": "v2/Metrics/Get a derived metric returns \"Bad Request\" response", + "operation_id": "GetDerivedMetric", + "request": { + "body": null, + "content_type": null, + "method": "GET", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "type": "literal", + "value": "1invalid.metric" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Get a derived metric returns \"Bad Request\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-not-found-response.json b/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-not-found-response.json new file mode 100644 index 0000000000..f7f4ee1c2b --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-not-found-response.json @@ -0,0 +1,35 @@ +{ + "api": "Metrics", + "expected_status": 404, + "feature": "Metrics", + "id": "v2/Metrics/Get a derived metric returns \"Not Found\" response", + "operation_id": "GetDerivedMetric", + "request": { + "body": null, + "content_type": null, + "method": "GET", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "type": "literal", + "value": "test.derived.missing.{{ unique_lower_alnum }}" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Get a derived metric returns \"Not Found\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-ok-response.json b/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-ok-response.json new file mode 100644 index 0000000000..8236b77d57 --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/get-a-derived-metric-returns-ok-response.json @@ -0,0 +1,35 @@ +{ + "api": "Metrics", + "expected_status": 200, + "feature": "Metrics", + "id": "v2/Metrics/Get a derived metric returns \"OK\" response", + "operation_id": "GetDerivedMetric", + "request": { + "body": null, + "content_type": null, + "method": "GET", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "path": "derived_metric.data.id", + "type": "fixture" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Get a derived metric returns \"OK\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-bad-request-response.json b/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-bad-request-response.json new file mode 100644 index 0000000000..c4fd70b8ae --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-bad-request-response.json @@ -0,0 +1,60 @@ +{ + "api": "Metrics", + "expected_status": 400, + "feature": "Metrics", + "id": "v2/Metrics/Update a derived metric returns \"Bad Request\" response", + "operation_id": "UpdateDerivedMetric", + "request": { + "body": { + "schema": { + "format": null, + "ref": "DerivedMetricCreateRequest", + "type": "object" + }, + "source": "inline", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.mismatch.{{ unique_lower_alnum }}", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "PUT", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "type": "literal", + "value": "test.derived.{{ unique_lower_alnum }}" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Update a derived metric returns \"Bad Request\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-not-found-response.json b/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-not-found-response.json new file mode 100644 index 0000000000..915ea92f14 --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-not-found-response.json @@ -0,0 +1,60 @@ +{ + "api": "Metrics", + "expected_status": 404, + "feature": "Metrics", + "id": "v2/Metrics/Update a derived metric returns \"Not Found\" response", + "operation_id": "UpdateDerivedMetric", + "request": { + "body": { + "schema": { + "format": null, + "ref": "DerivedMetricCreateRequest", + "type": "object" + }, + "source": "inline", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.missing.{{ unique_lower_alnum }}", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "PUT", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "type": "literal", + "value": "test.derived.missing.{{ unique_lower_alnum }}" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Update a derived metric returns \"Not Found\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-ok-response.json b/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-ok-response.json new file mode 100644 index 0000000000..c68ad50f0d --- /dev/null +++ b/tests/generated-test/test-runner-data/v2/metrics/update-a-derived-metric-returns-ok-response.json @@ -0,0 +1,60 @@ +{ + "api": "Metrics", + "expected_status": 200, + "feature": "Metrics", + "id": "v2/Metrics/Update a derived metric returns \"OK\" response", + "operation_id": "UpdateDerivedMetric", + "request": { + "body": { + "schema": { + "format": null, + "ref": "DerivedMetricCreateRequest", + "type": "object" + }, + "source": "inline", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a * 2", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "{{ derived_metric.data.id }}", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "PUT", + "pagination": false, + "parameters": [ + { + "explode": null, + "in": "path", + "name": "metric_name", + "required": true, + "schema": { + "format": null, + "ref": null, + "type": "string" + }, + "source": { + "path": "derived_metric.data.id", + "type": "fixture" + }, + "style": null + } + ], + "path": "/api/v2/metrics/derived-metrics/{metric_name}" + }, + "scenario": "Update a derived metric returns \"OK\" response", + "schema_version": 1, + "version": "v2" +} diff --git a/tests/generated-test/test-server-data/v2/metrics.json b/tests/generated-test/test-server-data/v2/metrics.json index d7e161a016..255cdd7eea 100644 --- a/tests/generated-test/test-server-data/v2/metrics.json +++ b/tests/generated-test/test-server-data/v2/metrics.json @@ -131,6 +131,232 @@ "scenario": "Configure tags for multiple metrics returns \"Accepted\" response", "version": "v2" }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:42.783Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "1invalid.metric", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/metrics/derived-metrics", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[\"metric name must start with a letter and only contain letters, numbers, dots, and underscores\"]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Bad Request", + "status": 400 + } + } + ], + "scenario": "Create a derived metric returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:45.093Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.testcreateaderivedmetricreturnsconflictresponse1791920325", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/metrics/derived-metrics", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"test.derived.testcreateaderivedmetricreturnsconflictresponse1791920325\",\"type\":\"derived_metrics\",\"attributes\":{\"definition\":{\"formula\":\"a\",\"queries\":[{\"data_source\":\"metrics\",\"name\":\"a\",\"query\":\"avg:system.cpu.user{*}\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.testcreateaderivedmetricreturnsconflictresponse1791920325", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/metrics/derived-metrics", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[\"A generated metric named \\\"test.derived.testcreateaderivedmetricreturnsconflictresponse1791920325\\\" already exists in this organization. Delete it or choose a different name.\"]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Conflict", + "status": 409 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/derived-metrics/test.derived.testcreateaderivedmetricreturnsconflictresponse1791920325", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + } + ], + "scenario": "Create a derived metric returns \"Conflict\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:45.914Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.testcreateaderivedmetricreturnscreatedresponse1791920325", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/metrics/derived-metrics", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"test.derived.testcreateaderivedmetricreturnscreatedresponse1791920325\",\"type\":\"derived_metrics\",\"attributes\":{\"definition\":{\"formula\":\"a\",\"queries\":[{\"data_source\":\"metrics\",\"name\":\"a\",\"query\":\"avg:system.cpu.user{*}\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/derived-metrics/test.derived.testcreateaderivedmetricreturnscreatedresponse1791920325", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + } + ], + "scenario": "Create a derived metric returns \"Created\" response", + "version": "v2" + }, { "feature": "Metrics", "frozen_at": "2022-05-12T11:27:30.563Z", @@ -611,6 +837,127 @@ "scenario": "Create a tag indexing rule with exclude_not_used_in_assets and exclude_tags_mode false returns \"Bad Request\" response", "version": "v2" }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:46.452Z", + "interactions": [ + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/derived-metrics/1invalid.metric", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[\"metric name must start with a letter and only contain letters, numbers, dots, and underscores\"]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Bad Request", + "status": 400 + } + } + ], + "scenario": "Delete a derived metric returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:46.687Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.testdeleteaderivedmetricreturnsnocontentresponse1791920326", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/metrics/derived-metrics", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"test.derived.testdeleteaderivedmetricreturnsnocontentresponse1791920326\",\"type\":\"derived_metrics\",\"attributes\":{\"definition\":{\"formula\":\"a\",\"queries\":[{\"data_source\":\"metrics\",\"name\":\"a\",\"query\":\"avg:system.cpu.user{*}\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/derived-metrics/test.derived.testdeleteaderivedmetricreturnsnocontentresponse1791920326", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/derived-metrics/test.derived.testdeleteaderivedmetricreturnsnocontentresponse1791920326", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + } + ], + "scenario": "Delete a derived metric returns \"No Content\" response", + "version": "v2" + }, { "feature": "Metrics", "frozen_at": "2022-05-12T11:26:28.844Z", @@ -661,30 +1008,150 @@ "value": { "data": { "attributes": { - "metric_type": "gauge", + "metric_type": "gauge", + "tags": [ + "app", + "datacenter", + "TestDeleteatagconfigurationreturnsNoContentresponse1652354788" + ] + }, + "id": "TestDeleteatagconfigurationreturnsNoContentresponse1652354788", + "type": "manage_tags" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/metrics/TestDeleteatagconfigurationreturnsNoContentresponse1652354788/tags", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"type\":\"manage_tags\",\"id\":\"TestDeleteatagconfigurationreturnsNoContentresponse1652354788\",\"attributes\":{\"tags\":[\"datacenter\",\"app\",\"TestDeleteatagconfigurationreturnsNoContentresponse1652354788\"],\"created_at\":\"2022-05-12T11:26:33.849417+00:00\",\"modified_at\":\"2022-05-12T11:26:33.849417+00:00\",\"metric_type\":\"gauge\",\"aggregations\":[{\"space\":\"avg\",\"time\":\"avg\"}]}}}" + }, + "headers": { + "content-type": "application/json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/TestDeleteatagconfigurationreturnsNoContentresponse1652354788/tags", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/TestDeleteatagconfigurationreturnsNoContentresponse1652354788/tags", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\": [\"TestDeleteatagconfigurationreturnsNoContentresponse1652354788 not found\"]}" + }, + "headers": { + "content-type": "application/json" + }, + "reason": "Not Found", + "status": 404 + } + } + ], + "scenario": "Delete a tag configuration returns \"No Content\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-06-04T16:39:36.667Z", + "interactions": [ + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/tag-indexing-rules/not-a-valid-uuid", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[\"Invalid tag indexing rule ID format\"]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Bad Request", + "status": 400 + } + } + ], + "scenario": "Delete a tag indexing rule returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-06-04T16:39:36.727Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "metric_name_matches": [ + "dd.TestDeleteatagindexingrulereturnsNoContentresponse1780591176.*" + ], + "name": "TestDeleteatagindexingrulereturnsNoContentresponse1780591176", "tags": [ - "app", - "datacenter", - "TestDeleteatagconfigurationreturnsNoContentresponse1652354788" + "env", + "service" ] }, - "id": "TestDeleteatagconfigurationreturnsNoContentresponse1652354788", - "type": "manage_tags" + "type": "tag_indexing_rules" } } }, "content_type": "application/json", "method": "POST", - "path": "/api/v2/metrics/TestDeleteatagconfigurationreturnsNoContentresponse1652354788/tags", + "path": "/api/v2/metrics/tag-indexing-rules", "query": [] }, "response": { "body": { "encoding": "text", - "value": "{\"data\":{\"type\":\"manage_tags\",\"id\":\"TestDeleteatagconfigurationreturnsNoContentresponse1652354788\",\"attributes\":{\"tags\":[\"datacenter\",\"app\",\"TestDeleteatagconfigurationreturnsNoContentresponse1652354788\"],\"created_at\":\"2022-05-12T11:26:33.849417+00:00\",\"modified_at\":\"2022-05-12T11:26:33.849417+00:00\",\"metric_type\":\"gauge\",\"aggregations\":[{\"space\":\"avg\",\"time\":\"avg\"}]}}}" + "value": "{\"data\":{\"id\":\"223d99dd-9c0a-4181-82b7-53d234bf5b26\",\"type\":\"tag_indexing_rules\",\"attributes\":{\"created_at\":\"2026-06-04T16:39:36.77795Z\",\"created_by_handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"exclude_tags_mode\":false,\"metric_name_matches\":[\"dd.TestDeleteatagindexingrulereturnsNoContentresponse1780591176.*\"],\"modified_at\":\"2026-06-04T16:39:36.77795Z\",\"modified_by_handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"name\":\"TestDeleteatagindexingrulereturnsNoContentresponse1780591176\",\"options\":{\"version\":1,\"data\":{\"override_previous_rules\":false,\"manage_preexisting_metrics\":true}},\"rule_order\":1,\"tags\":[\"env\",\"service\"]}}}" }, "headers": { - "content-type": "application/json" + "content-type": "application/vnd.api+json" }, "reason": "Created", "status": 201 @@ -698,7 +1165,7 @@ }, "content_type": "", "method": "DELETE", - "path": "/api/v2/metrics/TestDeleteatagconfigurationreturnsNoContentresponse1652354788/tags", + "path": "/api/v2/metrics/tag-indexing-rules/223d99dd-9c0a-4181-82b7-53d234bf5b26", "query": [] }, "response": { @@ -719,28 +1186,26 @@ }, "content_type": "", "method": "DELETE", - "path": "/api/v2/metrics/TestDeleteatagconfigurationreturnsNoContentresponse1652354788/tags", + "path": "/api/v2/metrics/tag-indexing-rules/223d99dd-9c0a-4181-82b7-53d234bf5b26", "query": [] }, "response": { "body": { "encoding": "text", - "value": "{\"errors\": [\"TestDeleteatagconfigurationreturnsNoContentresponse1652354788 not found\"]}" - }, - "headers": { - "content-type": "application/json" + "value": "" }, - "reason": "Not Found", - "status": 404 + "headers": {}, + "reason": "No Content", + "status": 204 } } ], - "scenario": "Delete a tag configuration returns \"No Content\" response", + "scenario": "Delete a tag indexing rule returns \"No Content\" response", "version": "v2" }, { "feature": "Metrics", - "frozen_at": "2026-06-04T16:39:36.667Z", + "frozen_at": "2026-10-13T19:38:47.504Z", "interactions": [ { "request": { @@ -749,14 +1214,14 @@ "value": null }, "content_type": "", - "method": "DELETE", - "path": "/api/v2/metrics/tag-indexing-rules/not-a-valid-uuid", + "method": "GET", + "path": "/api/v2/metrics/derived-metrics/1invalid.metric", "query": [] }, "response": { "body": { "encoding": "text", - "value": "{\"errors\":[\"Invalid tag indexing rule ID format\"]}" + "value": "{\"errors\":[\"metric name must start with a letter and only contain letters, numbers, dots, and underscores\"]}" }, "headers": { "content-type": "application/vnd.api+json" @@ -766,12 +1231,43 @@ } } ], - "scenario": "Delete a tag indexing rule returns \"Bad Request\" response", + "scenario": "Get a derived metric returns \"Bad Request\" response", "version": "v2" }, { "feature": "Metrics", - "frozen_at": "2026-06-04T16:39:36.727Z", + "frozen_at": "2026-10-13T19:38:47.745Z", + "interactions": [ + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "GET", + "path": "/api/v2/metrics/derived-metrics/test.derived.missing.testgetaderivedmetricreturnsnotfoundresponse1791920327", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[\"Not Found\"]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Not Found", + "status": 404 + } + } + ], + "scenario": "Get a derived metric returns \"Not Found\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:47.979Z", "interactions": [ { "request": { @@ -780,28 +1276,31 @@ "value": { "data": { "attributes": { - "metric_name_matches": [ - "dd.TestDeleteatagindexingrulereturnsNoContentresponse1780591176.*" - ], - "name": "TestDeleteatagindexingrulereturnsNoContentresponse1780591176", - "tags": [ - "env", - "service" - ] + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } }, - "type": "tag_indexing_rules" + "id": "test.derived.testgetaderivedmetricreturnsokresponse1791920327", + "type": "derived_metrics" } } }, "content_type": "application/json", "method": "POST", - "path": "/api/v2/metrics/tag-indexing-rules", + "path": "/api/v2/metrics/derived-metrics", "query": [] }, "response": { "body": { "encoding": "text", - "value": "{\"data\":{\"id\":\"223d99dd-9c0a-4181-82b7-53d234bf5b26\",\"type\":\"tag_indexing_rules\",\"attributes\":{\"created_at\":\"2026-06-04T16:39:36.77795Z\",\"created_by_handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"exclude_tags_mode\":false,\"metric_name_matches\":[\"dd.TestDeleteatagindexingrulereturnsNoContentresponse1780591176.*\"],\"modified_at\":\"2026-06-04T16:39:36.77795Z\",\"modified_by_handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"name\":\"TestDeleteatagindexingrulereturnsNoContentresponse1780591176\",\"options\":{\"version\":1,\"data\":{\"override_previous_rules\":false,\"manage_preexisting_metrics\":true}},\"rule_order\":1,\"tags\":[\"env\",\"service\"]}}}" + "value": "{\"data\":{\"id\":\"test.derived.testgetaderivedmetricreturnsokresponse1791920327\",\"type\":\"derived_metrics\",\"attributes\":{\"definition\":{\"formula\":\"a\",\"queries\":[{\"data_source\":\"metrics\",\"name\":\"a\",\"query\":\"avg:system.cpu.user{*}\"}]}}}}" }, "headers": { "content-type": "application/vnd.api+json" @@ -817,18 +1316,20 @@ "value": null }, "content_type": "", - "method": "DELETE", - "path": "/api/v2/metrics/tag-indexing-rules/223d99dd-9c0a-4181-82b7-53d234bf5b26", + "method": "GET", + "path": "/api/v2/metrics/derived-metrics/test.derived.testgetaderivedmetricreturnsokresponse1791920327", "query": [] }, "response": { "body": { "encoding": "text", - "value": "" + "value": "{\"data\":{\"id\":\"test.derived.testgetaderivedmetricreturnsokresponse1791920327\",\"type\":\"derived_metrics\",\"attributes\":{\"definition\":{\"formula\":\"a\",\"queries\":[{\"data_source\":\"metrics\",\"name\":\"a\",\"query\":\"avg:system.cpu.user{*}\"}]}}}}" }, - "headers": {}, - "reason": "No Content", - "status": 204 + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "OK", + "status": 200 } }, { @@ -839,7 +1340,7 @@ }, "content_type": "", "method": "DELETE", - "path": "/api/v2/metrics/tag-indexing-rules/223d99dd-9c0a-4181-82b7-53d234bf5b26", + "path": "/api/v2/metrics/derived-metrics/test.derived.testgetaderivedmetricreturnsokresponse1791920327", "query": [] }, "response": { @@ -853,7 +1354,7 @@ } } ], - "scenario": "Delete a tag indexing rule returns \"No Content\" response", + "scenario": "Get a derived metric returns \"OK\" response", "version": "v2" }, { @@ -4562,6 +5063,211 @@ "scenario": "Timeseries cross product query with spans data source returns \"OK\" response", "version": "v2" }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:48.794Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.mismatch.testupdateaderivedmetricreturnsbadrequestresponse1791920328", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "PUT", + "path": "/api/v2/metrics/derived-metrics/test.derived.testupdateaderivedmetricreturnsbadrequestresponse1791920328", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[\"invalid derived metric request body\"]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Bad Request", + "status": 400 + } + } + ], + "scenario": "Update a derived metric returns \"Bad Request\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:49.048Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.missing.testupdateaderivedmetricreturnsnotfoundresponse1791920329", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "PUT", + "path": "/api/v2/metrics/derived-metrics/test.derived.missing.testupdateaderivedmetricreturnsnotfoundresponse1791920329", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"errors\":[\"Not Found\"]}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Not Found", + "status": 404 + } + } + ], + "scenario": "Update a derived metric returns \"Not Found\" response", + "version": "v2" + }, + { + "feature": "Metrics", + "frozen_at": "2026-10-13T19:38:49.305Z", + "interactions": [ + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.testupdateaderivedmetricreturnsokresponse1791920329", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "POST", + "path": "/api/v2/metrics/derived-metrics", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"test.derived.testupdateaderivedmetricreturnsokresponse1791920329\",\"type\":\"derived_metrics\",\"attributes\":{\"definition\":{\"formula\":\"a\",\"queries\":[{\"data_source\":\"metrics\",\"name\":\"a\",\"query\":\"avg:system.cpu.user{*}\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "Created", + "status": 201 + } + }, + { + "request": { + "body": { + "type": "json", + "value": { + "data": { + "attributes": { + "definition": { + "formula": "a * 2", + "queries": [ + { + "data_source": "metrics", + "name": "a", + "query": "avg:system.cpu.user{*}" + } + ] + } + }, + "id": "test.derived.testupdateaderivedmetricreturnsokresponse1791920329", + "type": "derived_metrics" + } + } + }, + "content_type": "application/json", + "method": "PUT", + "path": "/api/v2/metrics/derived-metrics/test.derived.testupdateaderivedmetricreturnsokresponse1791920329", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "{\"data\":{\"id\":\"test.derived.testupdateaderivedmetricreturnsokresponse1791920329\",\"type\":\"derived_metrics\",\"attributes\":{\"definition\":{\"formula\":\"a * 2\",\"queries\":[{\"data_source\":\"metrics\",\"name\":\"a\",\"query\":\"avg:system.cpu.user{*}\"}]}}}}" + }, + "headers": { + "content-type": "application/vnd.api+json" + }, + "reason": "OK", + "status": 200 + } + }, + { + "request": { + "body": { + "type": "empty", + "value": null + }, + "content_type": "", + "method": "DELETE", + "path": "/api/v2/metrics/derived-metrics/test.derived.testupdateaderivedmetricreturnsokresponse1791920329", + "query": [] + }, + "response": { + "body": { + "encoding": "text", + "value": "" + }, + "headers": {}, + "reason": "No Content", + "status": 204 + } + } + ], + "scenario": "Update a derived metric returns \"OK\" response", + "version": "v2" + }, { "feature": "Metrics", "frozen_at": "2022-05-12T11:19:32.360Z", diff --git a/tests/v2/features/given.json b/tests/v2/features/given.json index b307445fc2..5cef0618e1 100644 --- a/tests/v2/features/given.json +++ b/tests/v2/features/given.json @@ -1134,6 +1134,18 @@ "tag": "Logs Restriction Queries", "operationId": "CreateRestrictionQuery" }, + { + "parameters": [ + { + "name": "body", + "value": "{\n \"data\": {\n \"id\": \"test.derived.{{ unique_lower_alnum }}\",\n \"type\": \"derived_metrics\",\n \"attributes\": {\n \"definition\": {\n \"formula\": \"a\",\n \"queries\": [{\"data_source\": \"metrics\", \"name\": \"a\", \"query\": \"avg:system.cpu.user{*}\"}]\n }\n }\n }\n}" + } + ], + "step": "there is a valid \"derived_metric\" in the system", + "key": "derived_metric", + "tag": "Metrics", + "operationId": "CreateDerivedMetric" + }, { "parameters": [ { diff --git a/tests/v2/features/metrics.feature b/tests/v2/features/metrics.feature index 2d187a673e..1b228ebeae 100644 --- a/tests/v2/features/metrics.feature +++ b/tests/v2/features/metrics.feature @@ -40,6 +40,36 @@ Feature: Metrics When the request is sent Then the response status is 404 Not Found + @team:ddoghq/metrics-experience + Scenario: Create a derived metric returns "Bad Request" response + Given a valid "appKeyAuth" key in the system + And new "CreateDerivedMetric" request + And body with value {"data": {"attributes": {"definition": {"formula": "a", "queries": [{"data_source": "metrics", "name": "a", "query": "avg:system.cpu.user{*}"}]}}, "id": "1invalid.metric", "type": "derived_metrics"}} + When the request is sent + Then the response status is 400 Bad Request + And the response "errors" has length 1 + + @team:ddoghq/metrics-experience + Scenario: Create a derived metric returns "Conflict" response + Given a valid "appKeyAuth" key in the system + And there is a valid "derived_metric" in the system + And new "CreateDerivedMetric" request + And body with value {"data": {"attributes": {"definition": {"formula": "a", "queries": [{"data_source": "metrics", "name": "a", "query": "avg:system.cpu.user{*}"}]}}, "id": "{{ derived_metric.data.id }}", "type": "derived_metrics"}} + When the request is sent + Then the response status is 409 Conflict + And the response "errors" has length 1 + + @team:ddoghq/metrics-experience + Scenario: Create a derived metric returns "Created" response + Given a valid "appKeyAuth" key in the system + And new "CreateDerivedMetric" request + And body with value {"data": {"attributes": {"definition": {"formula": "a", "queries": [{"data_source": "metrics", "name": "a", "query": "avg:system.cpu.user{*}"}]}}, "id": "test.derived.{{ unique_lower_alnum }}", "type": "derived_metrics"}} + When the request is sent + Then the response status is 201 Created + And the response "data.id" is equal to "test.derived.{{ unique_lower_alnum }}" + And the response "data.type" is equal to "derived_metrics" + And the response "data.attributes.definition.formula" is equal to "a" + @generated @skip @team:ddoghq/metrics-experience Scenario: Create a tag configuration returns "Bad Request" response Given a valid "appKeyAuth" key in the system @@ -142,6 +172,24 @@ Feature: Metrics When the request is sent Then the response status is 400 Bad Request + @team:ddoghq/metrics-experience + Scenario: Delete a derived metric returns "Bad Request" response + Given a valid "appKeyAuth" key in the system + And new "DeleteDerivedMetric" request + And request contains "metric_name" parameter with value "1invalid.metric" + When the request is sent + Then the response status is 400 Bad Request + And the response "errors" has length 1 + + @team:ddoghq/metrics-experience + Scenario: Delete a derived metric returns "No Content" response + Given a valid "appKeyAuth" key in the system + And there is a valid "derived_metric" in the system + And new "DeleteDerivedMetric" request + And request contains "metric_name" parameter from "derived_metric.data.id" + When the request is sent + Then the response status is 204 No Content + @generated @skip @team:ddoghq/metrics-experience Scenario: Delete a historical metrics configuration returns "Bad Request" response Given a valid "appKeyAuth" key in the system @@ -284,6 +332,36 @@ Feature: Metrics When the request is sent Then the response status is 422 Unprocessable Entity + @team:ddoghq/metrics-experience + Scenario: Get a derived metric returns "Bad Request" response + Given a valid "appKeyAuth" key in the system + And new "GetDerivedMetric" request + And request contains "metric_name" parameter with value "1invalid.metric" + When the request is sent + Then the response status is 400 Bad Request + And the response "errors" has length 1 + + @team:ddoghq/metrics-experience + Scenario: Get a derived metric returns "Not Found" response + Given a valid "appKeyAuth" key in the system + And new "GetDerivedMetric" request + And request contains "metric_name" parameter with value "test.derived.missing.{{ unique_lower_alnum }}" + When the request is sent + Then the response status is 404 Not Found + And the response "errors" has length 1 + + @team:ddoghq/metrics-experience + Scenario: Get a derived metric returns "OK" response + Given a valid "appKeyAuth" key in the system + And there is a valid "derived_metric" in the system + And new "GetDerivedMetric" request + And request contains "metric_name" parameter from "derived_metric.data.id" + When the request is sent + Then the response status is 200 OK + And the response "data.id" has the same value as "derived_metric.data.id" + And the response "data.type" is equal to "derived_metrics" + And the response "data.attributes.definition.formula" is equal to "a" + @generated @skip @team:ddoghq/metrics-experience Scenario: Get a historical metrics configuration returns "Bad Request" response Given a valid "appKeyAuth" key in the system @@ -1075,6 +1153,39 @@ Feature: Metrics Then the response status is 200 OK And the response "data.type" is equal to "timeseries_response" + @team:ddoghq/metrics-experience + Scenario: Update a derived metric returns "Bad Request" response + Given a valid "appKeyAuth" key in the system + And new "UpdateDerivedMetric" request + And request contains "metric_name" parameter with value "test.derived.{{ unique_lower_alnum }}" + And body with value {"data": {"attributes": {"definition": {"formula": "a", "queries": [{"data_source": "metrics", "name": "a", "query": "avg:system.cpu.user{*}"}]}}, "id": "test.derived.mismatch.{{ unique_lower_alnum }}", "type": "derived_metrics"}} + When the request is sent + Then the response status is 400 Bad Request + And the response "errors" has length 1 + + @team:ddoghq/metrics-experience + Scenario: Update a derived metric returns "Not Found" response + Given a valid "appKeyAuth" key in the system + And new "UpdateDerivedMetric" request + And request contains "metric_name" parameter with value "test.derived.missing.{{ unique_lower_alnum }}" + And body with value {"data": {"attributes": {"definition": {"formula": "a", "queries": [{"data_source": "metrics", "name": "a", "query": "avg:system.cpu.user{*}"}]}}, "id": "test.derived.missing.{{ unique_lower_alnum }}", "type": "derived_metrics"}} + When the request is sent + Then the response status is 404 Not Found + And the response "errors" has length 1 + + @team:ddoghq/metrics-experience + Scenario: Update a derived metric returns "OK" response + Given a valid "appKeyAuth" key in the system + And there is a valid "derived_metric" in the system + And new "UpdateDerivedMetric" request + And request contains "metric_name" parameter from "derived_metric.data.id" + And body with value {"data": {"attributes": {"definition": {"formula": "a * 2", "queries": [{"data_source": "metrics", "name": "a", "query": "avg:system.cpu.user{*}"}]}}, "id": "{{ derived_metric.data.id }}", "type": "derived_metrics"}} + When the request is sent + Then the response status is 200 OK + And the response "data.id" has the same value as "derived_metric.data.id" + And the response "data.type" is equal to "derived_metrics" + And the response "data.attributes.definition.formula" is equal to "a * 2" + @generated @skip @team:ddoghq/metrics-experience Scenario: Update a tag configuration returns "Bad Request" response Given a valid "appKeyAuth" key in the system diff --git a/tests/v2/features/undo.json b/tests/v2/features/undo.json index 8b44c94157..96457f3ccc 100644 --- a/tests/v2/features/undo.json +++ b/tests/v2/features/undo.json @@ -6085,6 +6085,37 @@ "type": "unsafe" } }, + "CreateDerivedMetric": { + "tag": "Metrics", + "undo": { + "operationId": "DeleteDerivedMetric", + "parameters": [ + { + "name": "metric_name", + "source": "data.id" + } + ], + "type": "unsafe" + } + }, + "DeleteDerivedMetric": { + "tag": "Metrics", + "undo": { + "type": "idempotent" + } + }, + "GetDerivedMetric": { + "tag": "Metrics", + "undo": { + "type": "safe" + } + }, + "UpdateDerivedMetric": { + "tag": "Metrics", + "undo": { + "type": "idempotent" + } + }, "CreateHistoricalMetricsConfiguration": { "tag": "Metrics", "undo": {