diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index d9bb88a10f..7d3eaefcd0 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -1741,6 +1741,9 @@ components: type: string markers: description: List of markers. + example: + - display_type: percentile + value: '90' items: $ref: '#/components/schemas/WidgetMarker' type: array @@ -1799,14 +1802,6 @@ components: - $ref: '#/components/schemas/FormulaAndFunctionMetricQueryDefinition' - $ref: '#/components/schemas/FormulaAndFunctionEventQueryDefinition' - $ref: '#/components/schemas/FormulaAndFunctionApmResourceStatsQueryDefinition' - DistributionWidgetHistogramRequestType: - description: Request type for the histogram request. - enum: - - histogram - example: histogram - type: string - x-enum-varnames: - - HISTOGRAM DistributionWidgetRequest: description: Updated distribution widget. properties: @@ -1816,6 +1811,11 @@ components: $ref: '#/components/schemas/ApmStatsQueryDefinition' event_query: $ref: '#/components/schemas/LogQueryDefinition' + formulas: + description: List of formulas that operate on queries. + items: + $ref: '#/components/schemas/WidgetFormula' + type: array log_query: $ref: '#/components/schemas/LogQueryDefinition' network_query: @@ -1827,10 +1827,17 @@ components: q: description: Widget query. type: string + queries: + description: List of queries that can be returned directly or used in formulas. + items: + $ref: '#/components/schemas/FormulaAndFunctionQueryDefinition' + type: array query: $ref: '#/components/schemas/DistributionWidgetHistogramRequestQuery' request_type: - $ref: '#/components/schemas/DistributionWidgetHistogramRequestType' + $ref: '#/components/schemas/WidgetHistogramRequestType' + response_format: + $ref: '#/components/schemas/FormulaAndFunctionResponseFormat' rum_query: $ref: '#/components/schemas/LogQueryDefinition' security_query: @@ -1854,6 +1861,11 @@ components: description: Specifies minimum value to show on the x-axis. It takes a number, percentile (p90 === 90th percentile), or auto for default behavior. type: string + num_buckets: + description: Number of value buckets to target, also known as the resolution + of the value bins. + format: int64 + type: integer scale: default: linear description: Specifies the scale type. Possible values are `linear`. @@ -3752,6 +3764,14 @@ components: type: array legend_size: $ref: '#/components/schemas/WidgetLegendSize' + markers: + description: List of markers. + example: + - display_type: percentile + value: '90' + items: + $ref: '#/components/schemas/WidgetMarker' + type: array requests: description: List of widget types. example: @@ -3776,6 +3796,8 @@ components: type: string type: $ref: '#/components/schemas/HeatMapWidgetDefinitionType' + xaxis: + $ref: '#/components/schemas/HeatMapWidgetXAxis' yaxis: $ref: '#/components/schemas/WidgetAxis' required: @@ -3819,6 +3841,10 @@ components: items: $ref: '#/components/schemas/FormulaAndFunctionQueryDefinition' type: array + query: + $ref: '#/components/schemas/FormulaAndFunctionMetricQueryDefinition' + request_type: + $ref: '#/components/schemas/WidgetHistogramRequestType' response_format: $ref: '#/components/schemas/FormulaAndFunctionResponseFormat' rum_query: @@ -3828,6 +3854,16 @@ components: style: $ref: '#/components/schemas/WidgetStyle' type: object + HeatMapWidgetXAxis: + description: X Axis controls for the heat map widget. + properties: + num_buckets: + description: Number of time buckets to target, also known as the resolution + of the time bins. This is only applicable for distribution of points (group + distributions use the roll-up modifier). + format: int64 + type: integer + type: object Host: description: Object representing a host. properties: @@ -25041,6 +25077,14 @@ components: x-enum-varnames: - CHECK - CLUSTER + WidgetHistogramRequestType: + description: Request type for the histogram request. + enum: + - histogram + example: histogram + type: string + x-enum-varnames: + - HISTOGRAM WidgetHorizontalAlign: description: Horizontal alignment. enum: @@ -25245,7 +25289,7 @@ components: display_type: description: "Combination of:\n - A severity error, warning, ok, or info\n \ - A line type: dashed, solid, or bold\nIn this case of a Distribution - widget, this can be set to be `x_axis_percentile`." + widget, this can be set to be `percentile`." example: error dashed type: string label: @@ -25256,8 +25300,11 @@ components: description: Timestamp for the widget. type: string value: - description: Value to apply. Can be a single value y = 15 or a range of + description: 'Value to apply. Can be a single value y = 15 or a range of values 0 < y < 10. + + For Distribution widgets with `display_type` set to `percentile`, this + should be a numeric percentile value (for example, "90" for P90).' example: y = 15 type: string required: diff --git a/docs/datadog_api_client.v1.model.rst b/docs/datadog_api_client.v1.model.rst index 60a000a874..5d9e194640 100644 --- a/docs/datadog_api_client.v1.model.rst +++ b/docs/datadog_api_client.v1.model.rst @@ -634,13 +634,6 @@ datadog\_api\_client.v1.model.distribution\_widget\_histogram\_request\_query mo :members: :show-inheritance: -datadog\_api\_client.v1.model.distribution\_widget\_histogram\_request\_type module ------------------------------------------------------------------------------------ - -.. automodule:: datadog_api_client.v1.model.distribution_widget_histogram_request_type - :members: - :show-inheritance: - datadog\_api\_client.v1.model.distribution\_widget\_request module ------------------------------------------------------------------ @@ -1152,6 +1145,13 @@ datadog\_api\_client.v1.model.heat\_map\_widget\_request module :members: :show-inheritance: +datadog\_api\_client.v1.model.heat\_map\_widget\_x\_axis module +--------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.heat_map_widget_x_axis + :members: + :show-inheritance: + datadog\_api\_client.v1.model.host module ----------------------------------------- @@ -6521,6 +6521,13 @@ datadog\_api\_client.v1.model.widget\_grouping module :members: :show-inheritance: +datadog\_api\_client.v1.model.widget\_histogram\_request\_type module +--------------------------------------------------------------------- + +.. automodule:: datadog_api_client.v1.model.widget_histogram_request_type + :members: + :show-inheritance: + datadog\_api\_client.v1.model.widget\_horizontal\_align module -------------------------------------------------------------- diff --git a/examples/v1/dashboards/CreateDashboard_1093147852.py b/examples/v1/dashboards/CreateDashboard_1093147852.py new file mode 100644 index 0000000000..efa4d2e3c0 --- /dev/null +++ b/examples/v1/dashboards/CreateDashboard_1093147852.py @@ -0,0 +1,91 @@ +""" +Create a new dashboard with distribution widget with markers and num_buckets +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v1.api.dashboards_api import DashboardsApi +from datadog_api_client.v1.model.dashboard import Dashboard +from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType +from datadog_api_client.v1.model.distribution_widget_definition import DistributionWidgetDefinition +from datadog_api_client.v1.model.distribution_widget_definition_type import DistributionWidgetDefinitionType +from datadog_api_client.v1.model.distribution_widget_request import DistributionWidgetRequest +from datadog_api_client.v1.model.distribution_widget_x_axis import DistributionWidgetXAxis +from datadog_api_client.v1.model.distribution_widget_y_axis import DistributionWidgetYAxis +from datadog_api_client.v1.model.formula_and_function_metric_aggregation import FormulaAndFunctionMetricAggregation +from datadog_api_client.v1.model.formula_and_function_metric_data_source import FormulaAndFunctionMetricDataSource +from datadog_api_client.v1.model.formula_and_function_metric_query_definition import ( + FormulaAndFunctionMetricQueryDefinition, +) +from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat +from datadog_api_client.v1.model.widget import Widget +from datadog_api_client.v1.model.widget_layout import WidgetLayout +from datadog_api_client.v1.model.widget_marker import WidgetMarker +from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + +body = Dashboard( + title="Example-Dashboard", + widgets=[ + Widget( + definition=DistributionWidgetDefinition( + title="", + title_size="16", + title_align=WidgetTextAlign.LEFT, + type=DistributionWidgetDefinitionType.DISTRIBUTION, + xaxis=DistributionWidgetXAxis( + scale="linear", + min="auto", + max="auto", + include_zero=True, + num_buckets=55, + ), + yaxis=DistributionWidgetYAxis( + scale="linear", + min="auto", + max="auto", + include_zero=True, + ), + markers=[ + WidgetMarker( + display_type="percentile", + value="50", + ), + WidgetMarker( + display_type="percentile", + value="99", + ), + WidgetMarker( + display_type="percentile", + value="90", + ), + ], + requests=[ + DistributionWidgetRequest( + response_format=FormulaAndFunctionResponseFormat.SCALAR, + queries=[ + FormulaAndFunctionMetricQueryDefinition( + data_source=FormulaAndFunctionMetricDataSource.METRICS, + name="query1", + query="avg:system.cpu.user{*} by {service}", + aggregator=FormulaAndFunctionMetricAggregation.AVG, + ), + ], + ), + ], + ), + layout=WidgetLayout( + x=0, + y=0, + width=4, + height=4, + ), + ), + ], + layout_type=DashboardLayoutType.ORDERED, +) + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = DashboardsApi(api_client) + response = api_instance.create_dashboard(body=body) + + print(response) diff --git a/examples/v1/dashboards/CreateDashboard_1442588603.py b/examples/v1/dashboards/CreateDashboard_1442588603.py index 22ba4a1251..5622beb15a 100644 --- a/examples/v1/dashboards/CreateDashboard_1442588603.py +++ b/examples/v1/dashboards/CreateDashboard_1442588603.py @@ -8,9 +8,6 @@ from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType from datadog_api_client.v1.model.distribution_widget_definition import DistributionWidgetDefinition from datadog_api_client.v1.model.distribution_widget_definition_type import DistributionWidgetDefinitionType -from datadog_api_client.v1.model.distribution_widget_histogram_request_type import ( - DistributionWidgetHistogramRequestType, -) from datadog_api_client.v1.model.distribution_widget_request import DistributionWidgetRequest from datadog_api_client.v1.model.distribution_widget_x_axis import DistributionWidgetXAxis from datadog_api_client.v1.model.distribution_widget_y_axis import DistributionWidgetYAxis @@ -24,6 +21,7 @@ FormulaAndFunctionApmResourceStatsQueryDefinition, ) from datadog_api_client.v1.model.widget import Widget +from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType from datadog_api_client.v1.model.widget_layout import WidgetLayout from datadog_api_client.v1.model.widget_style import WidgetStyle from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign @@ -66,7 +64,7 @@ primary_tag_name="datacenter", operation_name="universal.http.client", ), - request_type=DistributionWidgetHistogramRequestType.HISTOGRAM, + request_type=WidgetHistogramRequestType.HISTOGRAM, style=WidgetStyle( palette="dog_classic", ), diff --git a/examples/v1/dashboards/CreateDashboard_1617893815.py b/examples/v1/dashboards/CreateDashboard_1617893815.py new file mode 100644 index 0000000000..583887a291 --- /dev/null +++ b/examples/v1/dashboards/CreateDashboard_1617893815.py @@ -0,0 +1,95 @@ +""" +Create a new dashboard with formula and function distribution widget +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v1.api.dashboards_api import DashboardsApi +from datadog_api_client.v1.model.dashboard import Dashboard +from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType +from datadog_api_client.v1.model.distribution_widget_definition import DistributionWidgetDefinition +from datadog_api_client.v1.model.distribution_widget_definition_type import DistributionWidgetDefinitionType +from datadog_api_client.v1.model.distribution_widget_request import DistributionWidgetRequest +from datadog_api_client.v1.model.formula_and_function_event_aggregation import FormulaAndFunctionEventAggregation +from datadog_api_client.v1.model.formula_and_function_event_query_definition import ( + FormulaAndFunctionEventQueryDefinition, +) +from datadog_api_client.v1.model.formula_and_function_event_query_definition_compute import ( + FormulaAndFunctionEventQueryDefinitionCompute, +) +from datadog_api_client.v1.model.formula_and_function_event_query_definition_search import ( + FormulaAndFunctionEventQueryDefinitionSearch, +) +from datadog_api_client.v1.model.formula_and_function_event_query_group_by import FormulaAndFunctionEventQueryGroupBy +from datadog_api_client.v1.model.formula_and_function_event_query_group_by_sort import ( + FormulaAndFunctionEventQueryGroupBySort, +) +from datadog_api_client.v1.model.formula_and_function_events_data_source import FormulaAndFunctionEventsDataSource +from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat +from datadog_api_client.v1.model.query_sort_order import QuerySortOrder +from datadog_api_client.v1.model.widget import Widget +from datadog_api_client.v1.model.widget_layout import WidgetLayout +from datadog_api_client.v1.model.widget_legacy_live_span import WidgetLegacyLiveSpan +from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + +body = Dashboard( + title="Example-Dashboard", + widgets=[ + Widget( + layout=WidgetLayout( + x=0, + y=0, + width=47, + height=15, + ), + definition=DistributionWidgetDefinition( + title="", + title_size="16", + title_align=WidgetTextAlign.LEFT, + time=WidgetLegacyLiveSpan(), + type=DistributionWidgetDefinitionType.DISTRIBUTION, + requests=[ + DistributionWidgetRequest( + response_format=FormulaAndFunctionResponseFormat.SCALAR, + queries=[ + FormulaAndFunctionEventQueryDefinition( + data_source=FormulaAndFunctionEventsDataSource.LOGS, + name="query1", + search=FormulaAndFunctionEventQueryDefinitionSearch( + query="", + ), + indexes=[ + "*", + ], + compute=FormulaAndFunctionEventQueryDefinitionCompute( + aggregation=FormulaAndFunctionEventAggregation.AVG, + metric="@duration", + ), + group_by=[ + FormulaAndFunctionEventQueryGroupBy( + facet="service", + limit=1000, + sort=FormulaAndFunctionEventQueryGroupBySort( + aggregation=FormulaAndFunctionEventAggregation.COUNT, + order=QuerySortOrder.DESC, + ), + ), + ], + storage="hot", + ), + ], + ), + ], + ), + ), + ], + template_variables=[], + layout_type=DashboardLayoutType.FREE, + notify_list=[], +) + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = DashboardsApi(api_client) + response = api_instance.create_dashboard(body=body) + + print(response) diff --git a/examples/v1/dashboards/CreateDashboard_252716965.py b/examples/v1/dashboards/CreateDashboard_252716965.py index 80eddd36c7..2e9d45c2b9 100644 --- a/examples/v1/dashboards/CreateDashboard_252716965.py +++ b/examples/v1/dashboards/CreateDashboard_252716965.py @@ -8,9 +8,6 @@ from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType from datadog_api_client.v1.model.distribution_widget_definition import DistributionWidgetDefinition from datadog_api_client.v1.model.distribution_widget_definition_type import DistributionWidgetDefinitionType -from datadog_api_client.v1.model.distribution_widget_histogram_request_type import ( - DistributionWidgetHistogramRequestType, -) from datadog_api_client.v1.model.distribution_widget_request import DistributionWidgetRequest from datadog_api_client.v1.model.distribution_widget_x_axis import DistributionWidgetXAxis from datadog_api_client.v1.model.distribution_widget_y_axis import DistributionWidgetYAxis @@ -20,6 +17,7 @@ ) from datadog_api_client.v1.model.widget import Widget from datadog_api_client.v1.model.widget_custom_link import WidgetCustomLink +from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType from datadog_api_client.v1.model.widget_layout import WidgetLayout from datadog_api_client.v1.model.widget_style import WidgetStyle from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign @@ -59,7 +57,7 @@ data_source=FormulaAndFunctionMetricDataSource.METRICS, name="query1", ), - request_type=DistributionWidgetHistogramRequestType.HISTOGRAM, + request_type=WidgetHistogramRequestType.HISTOGRAM, style=WidgetStyle( palette="dog_classic", ), diff --git a/examples/v1/dashboards/CreateDashboard_2823363212.py b/examples/v1/dashboards/CreateDashboard_2823363212.py new file mode 100644 index 0000000000..c05511d92b --- /dev/null +++ b/examples/v1/dashboards/CreateDashboard_2823363212.py @@ -0,0 +1,79 @@ +""" +Create a new dashboard with heatmap widget with markers and num_buckets +""" + +from datadog_api_client import ApiClient, Configuration +from datadog_api_client.v1.api.dashboards_api import DashboardsApi +from datadog_api_client.v1.model.dashboard import Dashboard +from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType +from datadog_api_client.v1.model.formula_and_function_metric_data_source import FormulaAndFunctionMetricDataSource +from datadog_api_client.v1.model.formula_and_function_metric_query_definition import ( + FormulaAndFunctionMetricQueryDefinition, +) +from datadog_api_client.v1.model.heat_map_widget_definition import HeatMapWidgetDefinition +from datadog_api_client.v1.model.heat_map_widget_definition_type import HeatMapWidgetDefinitionType +from datadog_api_client.v1.model.heat_map_widget_request import HeatMapWidgetRequest +from datadog_api_client.v1.model.heat_map_widget_x_axis import HeatMapWidgetXAxis +from datadog_api_client.v1.model.widget import Widget +from datadog_api_client.v1.model.widget_axis import WidgetAxis +from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType +from datadog_api_client.v1.model.widget_layout import WidgetLayout +from datadog_api_client.v1.model.widget_marker import WidgetMarker +from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign + +body = Dashboard( + title="Example-Dashboard", + widgets=[ + Widget( + definition=HeatMapWidgetDefinition( + title="", + title_size="16", + title_align=WidgetTextAlign.LEFT, + type=HeatMapWidgetDefinitionType.HEATMAP, + xaxis=HeatMapWidgetXAxis( + num_buckets=75, + ), + yaxis=WidgetAxis( + scale="linear", + min="auto", + max="auto", + include_zero=True, + ), + markers=[ + WidgetMarker( + display_type="percentile", + value="50", + ), + WidgetMarker( + display_type="percentile", + value="99", + ), + ], + requests=[ + HeatMapWidgetRequest( + request_type=WidgetHistogramRequestType.HISTOGRAM, + query=FormulaAndFunctionMetricQueryDefinition( + data_source=FormulaAndFunctionMetricDataSource.METRICS, + name="query1", + query="histogram:trace.servlet.request{*}", + ), + ), + ], + ), + layout=WidgetLayout( + x=0, + y=0, + width=4, + height=4, + ), + ), + ], + layout_type=DashboardLayoutType.ORDERED, +) + +configuration = Configuration() +with ApiClient(configuration) as api_client: + api_instance = DashboardsApi(api_client) + response = api_instance.create_dashboard(body=body) + + print(response) diff --git a/examples/v1/dashboards/CreateDashboard_3882428227.py b/examples/v1/dashboards/CreateDashboard_3882428227.py index 6d51ae186d..3c0a8c2d56 100644 --- a/examples/v1/dashboards/CreateDashboard_3882428227.py +++ b/examples/v1/dashboards/CreateDashboard_3882428227.py @@ -8,9 +8,6 @@ from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType from datadog_api_client.v1.model.distribution_widget_definition import DistributionWidgetDefinition from datadog_api_client.v1.model.distribution_widget_definition_type import DistributionWidgetDefinitionType -from datadog_api_client.v1.model.distribution_widget_histogram_request_type import ( - DistributionWidgetHistogramRequestType, -) from datadog_api_client.v1.model.distribution_widget_request import DistributionWidgetRequest from datadog_api_client.v1.model.distribution_widget_x_axis import DistributionWidgetXAxis from datadog_api_client.v1.model.distribution_widget_y_axis import DistributionWidgetYAxis @@ -26,6 +23,7 @@ ) from datadog_api_client.v1.model.formula_and_function_events_data_source import FormulaAndFunctionEventsDataSource from datadog_api_client.v1.model.widget import Widget +from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType from datadog_api_client.v1.model.widget_layout import WidgetLayout from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign @@ -69,7 +67,7 @@ ], group_by=[], ), - request_type=DistributionWidgetHistogramRequestType.HISTOGRAM, + request_type=WidgetHistogramRequestType.HISTOGRAM, ), ], ), diff --git a/src/datadog_api_client/v1/model/distribution_widget_request.py b/src/datadog_api_client/v1/model/distribution_widget_request.py index 0a70f4c892..a37c55d6fc 100644 --- a/src/datadog_api_client/v1/model/distribution_widget_request.py +++ b/src/datadog_api_client/v1/model/distribution_widget_request.py @@ -3,7 +3,7 @@ # Copyright 2019-Present Datadog, Inc. from __future__ import annotations -from typing import Union, TYPE_CHECKING +from typing import List, Union, TYPE_CHECKING from datadog_api_client.model_utils import ( ModelNormal, @@ -16,13 +16,14 @@ if TYPE_CHECKING: from datadog_api_client.v1.model.log_query_definition import LogQueryDefinition from datadog_api_client.v1.model.apm_stats_query_definition import ApmStatsQueryDefinition + from datadog_api_client.v1.model.widget_formula import WidgetFormula from datadog_api_client.v1.model.process_query_definition import ProcessQueryDefinition + from datadog_api_client.v1.model.formula_and_function_query_definition import FormulaAndFunctionQueryDefinition from datadog_api_client.v1.model.distribution_widget_histogram_request_query import ( DistributionWidgetHistogramRequestQuery, ) - from datadog_api_client.v1.model.distribution_widget_histogram_request_type import ( - DistributionWidgetHistogramRequestType, - ) + from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType + from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat from datadog_api_client.v1.model.widget_style import WidgetStyle from datadog_api_client.v1.model.formula_and_function_metric_query_definition import ( FormulaAndFunctionMetricQueryDefinition, @@ -30,9 +31,21 @@ from datadog_api_client.v1.model.formula_and_function_event_query_definition import ( FormulaAndFunctionEventQueryDefinition, ) + from datadog_api_client.v1.model.formula_and_function_process_query_definition import ( + FormulaAndFunctionProcessQueryDefinition, + ) + from datadog_api_client.v1.model.formula_and_function_apm_dependency_stats_query_definition import ( + FormulaAndFunctionApmDependencyStatsQueryDefinition, + ) from datadog_api_client.v1.model.formula_and_function_apm_resource_stats_query_definition import ( FormulaAndFunctionApmResourceStatsQueryDefinition, ) + from datadog_api_client.v1.model.formula_and_function_slo_query_definition import ( + FormulaAndFunctionSLOQueryDefinition, + ) + from datadog_api_client.v1.model.formula_and_function_cloud_cost_query_definition import ( + FormulaAndFunctionCloudCostQueryDefinition, + ) class DistributionWidgetRequest(ModelNormal): @@ -40,26 +53,30 @@ class DistributionWidgetRequest(ModelNormal): def openapi_types(_): from datadog_api_client.v1.model.log_query_definition import LogQueryDefinition from datadog_api_client.v1.model.apm_stats_query_definition import ApmStatsQueryDefinition + from datadog_api_client.v1.model.widget_formula import WidgetFormula from datadog_api_client.v1.model.process_query_definition import ProcessQueryDefinition + from datadog_api_client.v1.model.formula_and_function_query_definition import FormulaAndFunctionQueryDefinition from datadog_api_client.v1.model.distribution_widget_histogram_request_query import ( DistributionWidgetHistogramRequestQuery, ) - from datadog_api_client.v1.model.distribution_widget_histogram_request_type import ( - DistributionWidgetHistogramRequestType, - ) + from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType + from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat from datadog_api_client.v1.model.widget_style import WidgetStyle return { "apm_query": (LogQueryDefinition,), "apm_stats_query": (ApmStatsQueryDefinition,), "event_query": (LogQueryDefinition,), + "formulas": ([WidgetFormula],), "log_query": (LogQueryDefinition,), "network_query": (LogQueryDefinition,), "process_query": (ProcessQueryDefinition,), "profile_metrics_query": (LogQueryDefinition,), "q": (str,), + "queries": ([FormulaAndFunctionQueryDefinition],), "query": (DistributionWidgetHistogramRequestQuery,), - "request_type": (DistributionWidgetHistogramRequestType,), + "request_type": (WidgetHistogramRequestType,), + "response_format": (FormulaAndFunctionResponseFormat,), "rum_query": (LogQueryDefinition,), "security_query": (LogQueryDefinition,), "style": (WidgetStyle,), @@ -69,13 +86,16 @@ def openapi_types(_): "apm_query": "apm_query", "apm_stats_query": "apm_stats_query", "event_query": "event_query", + "formulas": "formulas", "log_query": "log_query", "network_query": "network_query", "process_query": "process_query", "profile_metrics_query": "profile_metrics_query", "q": "q", + "queries": "queries", "query": "query", "request_type": "request_type", + "response_format": "response_format", "rum_query": "rum_query", "security_query": "security_query", "style": "style", @@ -86,11 +106,27 @@ def __init__( apm_query: Union[LogQueryDefinition, UnsetType] = unset, apm_stats_query: Union[ApmStatsQueryDefinition, UnsetType] = unset, event_query: Union[LogQueryDefinition, UnsetType] = unset, + formulas: Union[List[WidgetFormula], UnsetType] = unset, log_query: Union[LogQueryDefinition, UnsetType] = unset, network_query: Union[LogQueryDefinition, UnsetType] = unset, process_query: Union[ProcessQueryDefinition, UnsetType] = unset, profile_metrics_query: Union[LogQueryDefinition, UnsetType] = unset, q: Union[str, UnsetType] = unset, + queries: Union[ + List[ + Union[ + FormulaAndFunctionQueryDefinition, + FormulaAndFunctionMetricQueryDefinition, + FormulaAndFunctionEventQueryDefinition, + FormulaAndFunctionProcessQueryDefinition, + FormulaAndFunctionApmDependencyStatsQueryDefinition, + FormulaAndFunctionApmResourceStatsQueryDefinition, + FormulaAndFunctionSLOQueryDefinition, + FormulaAndFunctionCloudCostQueryDefinition, + ] + ], + UnsetType, + ] = unset, query: Union[ DistributionWidgetHistogramRequestQuery, FormulaAndFunctionMetricQueryDefinition, @@ -98,7 +134,8 @@ def __init__( FormulaAndFunctionApmResourceStatsQueryDefinition, UnsetType, ] = unset, - request_type: Union[DistributionWidgetHistogramRequestType, UnsetType] = unset, + request_type: Union[WidgetHistogramRequestType, UnsetType] = unset, + response_format: Union[FormulaAndFunctionResponseFormat, UnsetType] = unset, rum_query: Union[LogQueryDefinition, UnsetType] = unset, security_query: Union[LogQueryDefinition, UnsetType] = unset, style: Union[WidgetStyle, UnsetType] = unset, @@ -116,6 +153,9 @@ def __init__( :param event_query: The log query. :type event_query: LogQueryDefinition, optional + :param formulas: List of formulas that operate on queries. + :type formulas: [WidgetFormula], optional + :param log_query: The log query. :type log_query: LogQueryDefinition, optional @@ -131,11 +171,17 @@ def __init__( :param q: Widget query. :type q: str, optional + :param queries: List of queries that can be returned directly or used in formulas. + :type queries: [FormulaAndFunctionQueryDefinition], optional + :param query: Query definition for Distribution Widget Histogram Request :type query: DistributionWidgetHistogramRequestQuery, optional :param request_type: Request type for the histogram request. - :type request_type: DistributionWidgetHistogramRequestType, optional + :type request_type: WidgetHistogramRequestType, optional + + :param response_format: Timeseries, scalar, or event list response. Event list response formats are supported by Geomap widgets. + :type response_format: FormulaAndFunctionResponseFormat, optional :param rum_query: The log query. :type rum_query: LogQueryDefinition, optional @@ -152,6 +198,8 @@ def __init__( kwargs["apm_stats_query"] = apm_stats_query if event_query is not unset: kwargs["event_query"] = event_query + if formulas is not unset: + kwargs["formulas"] = formulas if log_query is not unset: kwargs["log_query"] = log_query if network_query is not unset: @@ -162,10 +210,14 @@ def __init__( kwargs["profile_metrics_query"] = profile_metrics_query if q is not unset: kwargs["q"] = q + if queries is not unset: + kwargs["queries"] = queries if query is not unset: kwargs["query"] = query if request_type is not unset: kwargs["request_type"] = request_type + if response_format is not unset: + kwargs["response_format"] = response_format if rum_query is not unset: kwargs["rum_query"] = rum_query if security_query is not unset: diff --git a/src/datadog_api_client/v1/model/distribution_widget_x_axis.py b/src/datadog_api_client/v1/model/distribution_widget_x_axis.py index 4baceb1a4c..abb64d4ec6 100644 --- a/src/datadog_api_client/v1/model/distribution_widget_x_axis.py +++ b/src/datadog_api_client/v1/model/distribution_widget_x_axis.py @@ -20,6 +20,7 @@ def openapi_types(_): "include_zero": (bool,), "max": (str,), "min": (str,), + "num_buckets": (int,), "scale": (str,), } @@ -27,6 +28,7 @@ def openapi_types(_): "include_zero": "include_zero", "max": "max", "min": "min", + "num_buckets": "num_buckets", "scale": "scale", } @@ -35,6 +37,7 @@ def __init__( include_zero: Union[bool, UnsetType] = unset, max: Union[str, UnsetType] = unset, min: Union[str, UnsetType] = unset, + num_buckets: Union[int, UnsetType] = unset, scale: Union[str, UnsetType] = unset, **kwargs, ): @@ -50,6 +53,9 @@ def __init__( :param min: Specifies minimum value to show on the x-axis. It takes a number, percentile (p90 === 90th percentile), or auto for default behavior. :type min: str, optional + :param num_buckets: Number of value buckets to target, also known as the resolution of the value bins. + :type num_buckets: int, optional + :param scale: Specifies the scale type. Possible values are ``linear``. :type scale: str, optional """ @@ -59,6 +65,8 @@ def __init__( kwargs["max"] = max if min is not unset: kwargs["min"] = min + if num_buckets is not unset: + kwargs["num_buckets"] = num_buckets if scale is not unset: kwargs["scale"] = scale super().__init__(kwargs) diff --git a/src/datadog_api_client/v1/model/heat_map_widget_definition.py b/src/datadog_api_client/v1/model/heat_map_widget_definition.py index fe8a20f606..b4d4be6ede 100644 --- a/src/datadog_api_client/v1/model/heat_map_widget_definition.py +++ b/src/datadog_api_client/v1/model/heat_map_widget_definition.py @@ -16,10 +16,12 @@ if TYPE_CHECKING: from datadog_api_client.v1.model.widget_custom_link import WidgetCustomLink from datadog_api_client.v1.model.widget_event import WidgetEvent + from datadog_api_client.v1.model.widget_marker import WidgetMarker from datadog_api_client.v1.model.heat_map_widget_request import HeatMapWidgetRequest from datadog_api_client.v1.model.widget_time import WidgetTime from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign from datadog_api_client.v1.model.heat_map_widget_definition_type import HeatMapWidgetDefinitionType + from datadog_api_client.v1.model.heat_map_widget_x_axis import HeatMapWidgetXAxis from datadog_api_client.v1.model.widget_axis import WidgetAxis from datadog_api_client.v1.model.widget_legacy_live_span import WidgetLegacyLiveSpan from datadog_api_client.v1.model.widget_new_live_span import WidgetNewLiveSpan @@ -38,16 +40,19 @@ class HeatMapWidgetDefinition(ModelNormal): def openapi_types(_): from datadog_api_client.v1.model.widget_custom_link import WidgetCustomLink from datadog_api_client.v1.model.widget_event import WidgetEvent + from datadog_api_client.v1.model.widget_marker import WidgetMarker from datadog_api_client.v1.model.heat_map_widget_request import HeatMapWidgetRequest from datadog_api_client.v1.model.widget_time import WidgetTime from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign from datadog_api_client.v1.model.heat_map_widget_definition_type import HeatMapWidgetDefinitionType + from datadog_api_client.v1.model.heat_map_widget_x_axis import HeatMapWidgetXAxis from datadog_api_client.v1.model.widget_axis import WidgetAxis return { "custom_links": ([WidgetCustomLink],), "events": ([WidgetEvent],), "legend_size": (str,), + "markers": ([WidgetMarker],), "requests": ([HeatMapWidgetRequest],), "show_legend": (bool,), "time": (WidgetTime,), @@ -55,6 +60,7 @@ def openapi_types(_): "title_align": (WidgetTextAlign,), "title_size": (str,), "type": (HeatMapWidgetDefinitionType,), + "xaxis": (HeatMapWidgetXAxis,), "yaxis": (WidgetAxis,), } @@ -62,6 +68,7 @@ def openapi_types(_): "custom_links": "custom_links", "events": "events", "legend_size": "legend_size", + "markers": "markers", "requests": "requests", "show_legend": "show_legend", "time": "time", @@ -69,6 +76,7 @@ def openapi_types(_): "title_align": "title_align", "title_size": "title_size", "type": "type", + "xaxis": "xaxis", "yaxis": "yaxis", } @@ -79,11 +87,13 @@ def __init__( custom_links: Union[List[WidgetCustomLink], UnsetType] = unset, events: Union[List[WidgetEvent], UnsetType] = unset, legend_size: Union[str, UnsetType] = unset, + markers: Union[List[WidgetMarker], UnsetType] = unset, show_legend: Union[bool, UnsetType] = unset, time: Union[WidgetTime, WidgetLegacyLiveSpan, WidgetNewLiveSpan, WidgetNewFixedSpan, UnsetType] = unset, title: Union[str, UnsetType] = unset, title_align: Union[WidgetTextAlign, UnsetType] = unset, title_size: Union[str, UnsetType] = unset, + xaxis: Union[HeatMapWidgetXAxis, UnsetType] = unset, yaxis: Union[WidgetAxis, UnsetType] = unset, **kwargs, ): @@ -99,6 +109,9 @@ def __init__( :param legend_size: Available legend sizes for a widget. Should be one of "0", "2", "4", "8", "16", or "auto". :type legend_size: str, optional + :param markers: List of markers. + :type markers: [WidgetMarker], optional + :param requests: List of widget types. :type requests: [HeatMapWidgetRequest] @@ -120,6 +133,9 @@ def __init__( :param type: Type of the heat map widget. :type type: HeatMapWidgetDefinitionType + :param xaxis: X Axis controls for the heat map widget. + :type xaxis: HeatMapWidgetXAxis, optional + :param yaxis: Axis controls for the widget. :type yaxis: WidgetAxis, optional """ @@ -129,6 +145,8 @@ def __init__( kwargs["events"] = events if legend_size is not unset: kwargs["legend_size"] = legend_size + if markers is not unset: + kwargs["markers"] = markers if show_legend is not unset: kwargs["show_legend"] = show_legend if time is not unset: @@ -139,6 +157,8 @@ def __init__( kwargs["title_align"] = title_align if title_size is not unset: kwargs["title_size"] = title_size + if xaxis is not unset: + kwargs["xaxis"] = xaxis if yaxis is not unset: kwargs["yaxis"] = yaxis super().__init__(kwargs) diff --git a/src/datadog_api_client/v1/model/heat_map_widget_request.py b/src/datadog_api_client/v1/model/heat_map_widget_request.py index 3d80e4f321..e062640246 100644 --- a/src/datadog_api_client/v1/model/heat_map_widget_request.py +++ b/src/datadog_api_client/v1/model/heat_map_widget_request.py @@ -19,6 +19,10 @@ from datadog_api_client.v1.model.widget_formula import WidgetFormula from datadog_api_client.v1.model.process_query_definition import ProcessQueryDefinition from datadog_api_client.v1.model.formula_and_function_query_definition import FormulaAndFunctionQueryDefinition + from datadog_api_client.v1.model.formula_and_function_metric_query_definition import ( + FormulaAndFunctionMetricQueryDefinition, + ) + from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat from datadog_api_client.v1.model.widget_style import WidgetStyle from datadog_api_client.v1.model.formula_and_function_metric_query_definition import ( @@ -52,6 +56,10 @@ def openapi_types(_): from datadog_api_client.v1.model.widget_formula import WidgetFormula from datadog_api_client.v1.model.process_query_definition import ProcessQueryDefinition from datadog_api_client.v1.model.formula_and_function_query_definition import FormulaAndFunctionQueryDefinition + from datadog_api_client.v1.model.formula_and_function_metric_query_definition import ( + FormulaAndFunctionMetricQueryDefinition, + ) + from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat from datadog_api_client.v1.model.widget_style import WidgetStyle @@ -65,6 +73,8 @@ def openapi_types(_): "profile_metrics_query": (LogQueryDefinition,), "q": (str,), "queries": ([FormulaAndFunctionQueryDefinition],), + "query": (FormulaAndFunctionMetricQueryDefinition,), + "request_type": (WidgetHistogramRequestType,), "response_format": (FormulaAndFunctionResponseFormat,), "rum_query": (LogQueryDefinition,), "security_query": (LogQueryDefinition,), @@ -81,6 +91,8 @@ def openapi_types(_): "profile_metrics_query": "profile_metrics_query", "q": "q", "queries": "queries", + "query": "query", + "request_type": "request_type", "response_format": "response_format", "rum_query": "rum_query", "security_query": "security_query", @@ -112,6 +124,8 @@ def __init__( ], UnsetType, ] = unset, + query: Union[FormulaAndFunctionMetricQueryDefinition, UnsetType] = unset, + request_type: Union[WidgetHistogramRequestType, UnsetType] = unset, response_format: Union[FormulaAndFunctionResponseFormat, UnsetType] = unset, rum_query: Union[LogQueryDefinition, UnsetType] = unset, security_query: Union[LogQueryDefinition, UnsetType] = unset, @@ -148,6 +162,12 @@ def __init__( :param queries: List of queries that can be returned directly or used in formulas. :type queries: [FormulaAndFunctionQueryDefinition], optional + :param query: A formula and functions metrics query. + :type query: FormulaAndFunctionMetricQueryDefinition, optional + + :param request_type: Request type for the histogram request. + :type request_type: WidgetHistogramRequestType, optional + :param response_format: Timeseries, scalar, or event list response. Event list response formats are supported by Geomap widgets. :type response_format: FormulaAndFunctionResponseFormat, optional @@ -178,6 +198,10 @@ def __init__( kwargs["q"] = q if queries is not unset: kwargs["queries"] = queries + if query is not unset: + kwargs["query"] = query + if request_type is not unset: + kwargs["request_type"] = request_type if response_format is not unset: kwargs["response_format"] = response_format if rum_query is not unset: diff --git a/src/datadog_api_client/v1/model/heat_map_widget_x_axis.py b/src/datadog_api_client/v1/model/heat_map_widget_x_axis.py new file mode 100644 index 0000000000..2e14117fa2 --- /dev/null +++ b/src/datadog_api_client/v1/model/heat_map_widget_x_axis.py @@ -0,0 +1,36 @@ +# 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 + +from datadog_api_client.model_utils import ( + ModelNormal, + cached_property, + unset, + UnsetType, +) + + +class HeatMapWidgetXAxis(ModelNormal): + @cached_property + def openapi_types(_): + return { + "num_buckets": (int,), + } + + attribute_map = { + "num_buckets": "num_buckets", + } + + def __init__(self_, num_buckets: Union[int, UnsetType] = unset, **kwargs): + """ + X Axis controls for the heat map widget. + + :param num_buckets: Number of time buckets to target, also known as the resolution of the time bins. This is only applicable for distribution of points (group distributions use the roll-up modifier). + :type num_buckets: int, optional + """ + if num_buckets is not unset: + kwargs["num_buckets"] = num_buckets + super().__init__(kwargs) diff --git a/src/datadog_api_client/v1/model/distribution_widget_histogram_request_type.py b/src/datadog_api_client/v1/model/widget_histogram_request_type.py similarity index 75% rename from src/datadog_api_client/v1/model/distribution_widget_histogram_request_type.py rename to src/datadog_api_client/v1/model/widget_histogram_request_type.py index 4670f08808..a2e15a0d68 100644 --- a/src/datadog_api_client/v1/model/distribution_widget_histogram_request_type.py +++ b/src/datadog_api_client/v1/model/widget_histogram_request_type.py @@ -12,7 +12,7 @@ from typing import ClassVar -class DistributionWidgetHistogramRequestType(ModelSimple): +class WidgetHistogramRequestType(ModelSimple): """ Request type for the histogram request. @@ -23,7 +23,7 @@ class DistributionWidgetHistogramRequestType(ModelSimple): allowed_values = { "histogram", } - HISTOGRAM: ClassVar["DistributionWidgetHistogramRequestType"] + HISTOGRAM: ClassVar["WidgetHistogramRequestType"] @cached_property def openapi_types(_): @@ -32,4 +32,4 @@ def openapi_types(_): } -DistributionWidgetHistogramRequestType.HISTOGRAM = DistributionWidgetHistogramRequestType("histogram") +WidgetHistogramRequestType.HISTOGRAM = WidgetHistogramRequestType("histogram") diff --git a/src/datadog_api_client/v1/model/widget_marker.py b/src/datadog_api_client/v1/model/widget_marker.py index d98fe3297c..76931352a0 100644 --- a/src/datadog_api_client/v1/model/widget_marker.py +++ b/src/datadog_api_client/v1/model/widget_marker.py @@ -45,7 +45,7 @@ def __init__( * A severity error, warning, ok, or info * A line type: dashed, solid, or bold - In this case of a Distribution widget, this can be set to be ``x_axis_percentile``. + In this case of a Distribution widget, this can be set to be ``percentile``. :type display_type: str, optional :param label: Label to display over the marker. @@ -55,6 +55,7 @@ def __init__( :type time: str, optional :param value: Value to apply. Can be a single value y = 15 or a range of values 0 < y < 10. + For Distribution widgets with ``display_type`` set to ``percentile`` , this should be a numeric percentile value (for example, "90" for P90). :type value: str """ if display_type is not unset: diff --git a/src/datadog_api_client/v1/models/__init__.py b/src/datadog_api_client/v1/models/__init__.py index 062b19bebe..2c174ff628 100644 --- a/src/datadog_api_client/v1/models/__init__.py +++ b/src/datadog_api_client/v1/models/__init__.py @@ -90,9 +90,6 @@ from datadog_api_client.v1.model.distribution_widget_histogram_request_query import ( DistributionWidgetHistogramRequestQuery, ) -from datadog_api_client.v1.model.distribution_widget_histogram_request_type import ( - DistributionWidgetHistogramRequestType, -) from datadog_api_client.v1.model.distribution_widget_request import DistributionWidgetRequest from datadog_api_client.v1.model.distribution_widget_x_axis import DistributionWidgetXAxis from datadog_api_client.v1.model.distribution_widget_y_axis import DistributionWidgetYAxis @@ -199,6 +196,7 @@ from datadog_api_client.v1.model.heat_map_widget_definition import HeatMapWidgetDefinition from datadog_api_client.v1.model.heat_map_widget_definition_type import HeatMapWidgetDefinitionType from datadog_api_client.v1.model.heat_map_widget_request import HeatMapWidgetRequest +from datadog_api_client.v1.model.heat_map_widget_x_axis import HeatMapWidgetXAxis from datadog_api_client.v1.model.host import Host from datadog_api_client.v1.model.host_list_response import HostListResponse from datadog_api_client.v1.model.host_map_request import HostMapRequest @@ -1084,6 +1082,7 @@ from datadog_api_client.v1.model.widget_formula_style import WidgetFormulaStyle from datadog_api_client.v1.model.widget_group_sort import WidgetGroupSort from datadog_api_client.v1.model.widget_grouping import WidgetGrouping +from datadog_api_client.v1.model.widget_histogram_request_type import WidgetHistogramRequestType from datadog_api_client.v1.model.widget_horizontal_align import WidgetHorizontalAlign from datadog_api_client.v1.model.widget_image_sizing import WidgetImageSizing from datadog_api_client.v1.model.widget_layout import WidgetLayout @@ -1213,7 +1212,6 @@ "DistributionWidgetDefinition", "DistributionWidgetDefinitionType", "DistributionWidgetHistogramRequestQuery", - "DistributionWidgetHistogramRequestType", "DistributionWidgetRequest", "DistributionWidgetXAxis", "DistributionWidgetYAxis", @@ -1290,6 +1288,7 @@ "HeatMapWidgetDefinition", "HeatMapWidgetDefinitionType", "HeatMapWidgetRequest", + "HeatMapWidgetXAxis", "Host", "HostListResponse", "HostMapRequest", @@ -2055,6 +2054,7 @@ "WidgetFormulaStyle", "WidgetGroupSort", "WidgetGrouping", + "WidgetHistogramRequestType", "WidgetHorizontalAlign", "WidgetImageSizing", "WidgetLayout", diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets.frozen b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets.frozen new file mode 100644 index 0000000000..957e38ac24 --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets.frozen @@ -0,0 +1 @@ +2025-12-04T23:08:04.708Z \ No newline at end of file diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets.yaml b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets.yaml new file mode 100644 index 0000000000..c689a70668 --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets.yaml @@ -0,0 +1,39 @@ +interactions: +- request: + body: '{"layout_type":"ordered","title":"Test-Create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets-1764889684","widgets":[{"definition":{"markers":[{"display_type":"percentile","value":"50"},{"display_type":"percentile","value":"99"},{"display_type":"percentile","value":"90"}],"requests":[{"queries":[{"aggregator":"avg","data_source":"metrics","name":"query1","query":"avg:system.cpu.user{*} + by {service}"}],"response_format":"scalar"}],"title":"","title_align":"left","title_size":"16","type":"distribution","xaxis":{"include_zero":true,"max":"auto","min":"auto","num_buckets":55,"scale":"linear"},"yaxis":{"include_zero":true,"max":"auto","min":"auto","scale":"linear"}},"layout":{"height":4,"width":4,"x":0,"y":0}}]}' + headers: + accept: + - application/json + content-type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v1/dashboard + response: + body: + string: '{"id":"ved-atm-2g5","title":"Test-Create_a_new_dashboard_with_distribution_widget_with_markers_and_num_buckets-1764889684","description":null,"author_handle":"shishi.liu@datadoghq.com","author_name":"Shishi + Liu","layout_type":"ordered","url":"/dashboard/ved-atm-2g5/test-createanewdashboardwithdistributionwidgetwithmarkersandnumbuckets-176488968","template_variables":null,"widgets":[{"definition":{"markers":[{"display_type":"percentile","value":"50"},{"display_type":"percentile","value":"99"},{"display_type":"percentile","value":"90"}],"requests":[{"queries":[{"aggregator":"avg","data_source":"metrics","name":"query1","query":"avg:system.cpu.user{*} + by {service}"}],"response_format":"scalar"}],"title":"","title_align":"left","title_size":"16","type":"distribution","xaxis":{"include_zero":true,"max":"auto","min":"auto","num_buckets":55,"scale":"linear"},"yaxis":{"include_zero":true,"max":"auto","min":"auto","scale":"linear"}},"layout":{"height":4,"width":4,"x":0,"y":0},"id":984443192078703}],"notify_list":null,"created_at":"2025-12-04T23:08:05.111437+00:00","modified_at":"2025-12-04T23:08:05.111437+00:00","restricted_roles":[]}' + 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/dashboard/ved-atm-2g5 + response: + body: + string: '{"deleted_dashboard_id":"ved-atm-2g5"}' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +version: 1 diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_formula_and_function_distribution_widget.frozen b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_formula_and_function_distribution_widget.frozen new file mode 100644 index 0000000000..028130f6b8 --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_formula_and_function_distribution_widget.frozen @@ -0,0 +1 @@ +2025-12-15T17:03:52.164Z \ No newline at end of file diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_formula_and_function_distribution_widget.yaml b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_formula_and_function_distribution_widget.yaml new file mode 100644 index 0000000000..04410caad8 --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_formula_and_function_distribution_widget.yaml @@ -0,0 +1,37 @@ +interactions: +- request: + body: '{"layout_type":"free","notify_list":[],"template_variables":[],"title":"Test-Create_a_new_dashboard_with_formula_and_function_distribution_widget-1765818232","widgets":[{"definition":{"requests":[{"queries":[{"compute":{"aggregation":"avg","metric":"@duration"},"data_source":"logs","group_by":[{"facet":"service","limit":1000,"sort":{"aggregation":"count","order":"desc"}}],"indexes":["*"],"name":"query1","search":{"query":""},"storage":"hot"}],"response_format":"scalar"}],"time":{},"title":"","title_align":"left","title_size":"16","type":"distribution"},"layout":{"height":15,"width":47,"x":0,"y":0}}]}' + headers: + accept: + - application/json + content-type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v1/dashboard + response: + body: + string: '{"id":"ii3-z6t-p8x","title":"Test-Create_a_new_dashboard_with_formula_and_function_distribution_widget-1765818232","description":null,"author_handle":"shishi.liu@datadoghq.com","author_name":"Shishi + Liu","layout_type":"free","url":"/dashboard/ii3-z6t-p8x/test-createanewdashboardwithformulaandfunctiondistributionwidget-1765818232","template_variables":[],"widgets":[{"definition":{"requests":[{"queries":[{"compute":{"aggregation":"avg","metric":"@duration"},"data_source":"logs","group_by":[{"facet":"service","limit":1000,"sort":{"aggregation":"count","order":"desc"}}],"indexes":["*"],"name":"query1","search":{"query":""},"storage":"hot"}],"response_format":"scalar"}],"time":{},"title":"","title_align":"left","title_size":"16","type":"distribution"},"layout":{"height":15,"width":47,"x":0,"y":0},"id":1822470106302094}],"notify_list":[],"created_at":"2025-12-15T17:03:52.607823+00:00","modified_at":"2025-12-15T17:03:52.607823+00:00","restricted_roles":[]}' + 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/dashboard/ii3-z6t-p8x + response: + body: + string: '{"deleted_dashboard_id":"ii3-z6t-p8x"}' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +version: 1 diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets.frozen b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets.frozen new file mode 100644 index 0000000000..502143efd6 --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets.frozen @@ -0,0 +1 @@ +2025-12-15T17:39:03.378Z \ No newline at end of file diff --git a/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets.yaml b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets.yaml new file mode 100644 index 0000000000..185b3953ea --- /dev/null +++ b/tests/v1/cassettes/test_scenarios/test_create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets.yaml @@ -0,0 +1,37 @@ +interactions: +- request: + body: '{"layout_type":"ordered","title":"Test-Create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets-1765820343","widgets":[{"definition":{"markers":[{"display_type":"percentile","value":"50"},{"display_type":"percentile","value":"99"}],"requests":[{"query":{"data_source":"metrics","name":"query1","query":"histogram:trace.servlet.request{*}"},"request_type":"histogram"}],"title":"","title_align":"left","title_size":"16","type":"heatmap","xaxis":{"num_buckets":75},"yaxis":{"include_zero":true,"max":"auto","min":"auto","scale":"linear"}},"layout":{"height":4,"width":4,"x":0,"y":0}}]}' + headers: + accept: + - application/json + content-type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v1/dashboard + response: + body: + string: '{"id":"r3p-kik-ven","title":"Test-Create_a_new_dashboard_with_heatmap_widget_with_markers_and_num_buckets-1765820343","description":null,"author_handle":"shishi.liu@datadoghq.com","author_name":"Shishi + Liu","layout_type":"ordered","url":"/dashboard/r3p-kik-ven/test-createanewdashboardwithheatmapwidgetwithmarkersandnumbuckets-1765820343","template_variables":null,"widgets":[{"definition":{"markers":[{"display_type":"percentile","value":"50"},{"display_type":"percentile","value":"99"}],"requests":[{"query":{"data_source":"metrics","name":"query1","query":"histogram:trace.servlet.request{*}"},"request_type":"histogram"}],"title":"","title_align":"left","title_size":"16","type":"heatmap","xaxis":{"num_buckets":75},"yaxis":{"include_zero":true,"max":"auto","min":"auto","scale":"linear"}},"layout":{"height":4,"width":4,"x":0,"y":0},"id":4627813855695599}],"notify_list":null,"created_at":"2025-12-15T17:39:03.852775+00:00","modified_at":"2025-12-15T17:39:03.852775+00:00","restricted_roles":[]}' + 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/dashboard/r3p-kik-ven + response: + body: + string: '{"deleted_dashboard_id":"r3p-kik-ven"}' + headers: + content-type: + - application/json + status: + code: 200 + message: OK +version: 1 diff --git a/tests/v1/features/dashboards.feature b/tests/v1/features/dashboards.feature index 588c609ced..076546114f 100644 --- a/tests/v1/features/dashboards.feature +++ b/tests/v1/features/dashboards.feature @@ -368,6 +368,15 @@ Feature: Dashboards And the response "widgets[0].definition.requests[0].apm_stats_query.service" is equal to "cassandra" And the response "widgets[0].definition.requests[0].apm_stats_query.name" is equal to "cassandra.query" + @team:DataDog/dashboards-backend + Scenario: Create a new dashboard with distribution widget with markers and num_buckets + Given new "CreateDashboard" request + And body with value { "title": "{{ unique }}", "widgets": [{"definition": { "title": "", "title_size": "16", "title_align": "left", "type": "distribution", "xaxis": { "scale": "linear", "min": "auto", "max": "auto", "include_zero": true, "num_buckets": 55 }, "yaxis": { "scale": "linear", "min": "auto", "max": "auto", "include_zero": true }, "markers": [{ "display_type": "percentile", "value": "50" }, { "display_type": "percentile", "value": "99" }, { "display_type": "percentile", "value": "90" }], "requests": [{ "response_format": "scalar", "queries": [{ "data_source": "metrics", "name": "query1", "query": "avg:system.cpu.user{*} by {service}", "aggregator": "avg" }] }] }, "layout": { "x": 0, "y": 0, "width": 4, "height": 4 } } ], "layout_type": "ordered" } + When the request is sent + Then the response status is 200 OK + And the response "widgets[0].definition.xaxis.num_buckets" is equal to 55 + And the response "widgets[0].definition.markers" is equal to [{"display_type": "percentile", "value": "50"}, {"display_type": "percentile", "value": "99"}, {"display_type": "percentile", "value": "90"}] + @team:DataDog/dashboards-backend Scenario: Create a new dashboard with event_stream list_stream widget Given new "CreateDashboard" request @@ -397,6 +406,20 @@ Feature: Dashboards And the response "widgets[0].definition.type" is equal to "event_timeline" And the response "widgets[0].definition.query" is equal to "status:error priority:all" + @team:DataDog/dashboards-backend + Scenario: Create a new dashboard with formula and function distribution widget + Given new "CreateDashboard" request + And body with value {"title": "{{ unique }}", "widgets": [{"layout": {"x": 0, "y": 0, "width": 47, "height": 15}, "definition": {"title": "", "title_size": "16", "title_align": "left", "time": {}, "type": "distribution", "requests": [{"response_format": "scalar", "queries": [{"data_source": "logs", "name": "query1", "search": {"query": ""}, "indexes": ["*"], "compute": {"aggregation": "avg", "metric": "@duration"}, "group_by": [{"facet": "service", "limit": 1000, "sort": {"aggregation": "count", "order": "desc"}}], "storage": "hot"}]}]}}], "template_variables": [], "layout_type": "free", "notify_list": []} + When the request is sent + Then the response status is 200 OK + And the response "widgets[0].definition.type" is equal to "distribution" + And the response "widgets[0].definition.requests[0].response_format" is equal to "scalar" + And the response "widgets[0].definition.requests[0].queries[0].data_source" is equal to "logs" + And the response "widgets[0].definition.requests[0].queries[0].name" is equal to "query1" + And the response "widgets[0].definition.requests[0].queries[0].compute.aggregation" is equal to "avg" + And the response "widgets[0].definition.requests[0].queries[0].compute.metric" is equal to "@duration" + And the response "widgets[0].definition.requests[0].queries[0].group_by[0].facet" is equal to "service" + @team:DataDog/dashboards-backend Scenario: Create a new dashboard with formula and function heatmap widget Given new "CreateDashboard" request @@ -471,6 +494,15 @@ Feature: Dashboards And the response "widgets[0].definition.type" is equal to "heatmap" And the response "widgets[0].definition.requests[0].q" is equal to "avg:system.cpu.user{*} by {service}" + @team:DataDog/dashboards-backend + Scenario: Create a new dashboard with heatmap widget with markers and num_buckets + Given new "CreateDashboard" request + And body with value { "title": "{{ unique }}", "widgets": [{"definition": { "title": "", "title_size": "16", "title_align": "left", "type": "heatmap", "xaxis": { "num_buckets": 75 }, "yaxis": { "scale": "linear", "min": "auto", "max": "auto", "include_zero": true }, "markers": [{ "display_type": "percentile", "value": "50" }, { "display_type": "percentile", "value": "99" }], "requests": [{ "request_type": "histogram", "query": { "data_source": "metrics", "name": "query1", "query": "histogram:trace.servlet.request{*}"} }] }, "layout": { "x": 0, "y": 0, "width": 4, "height": 4 } }], "layout_type": "ordered" } + When the request is sent + Then the response status is 200 OK + And the response "widgets[0].definition.xaxis.num_buckets" is equal to 75 + And the response "widgets[0].definition.markers" is equal to [{"display_type": "percentile", "value": "50"}, {"display_type": "percentile", "value": "99"}] + @team:DataDog/dashboards-backend Scenario: Create a new dashboard with hostmap widget Given new "CreateDashboard" request