Skip to content

Commit f46f81b

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Add Formula and Function query support to heatmap widgets (#1661)
Co-authored-by: ci.datadog-api-spec <[email protected]>
1 parent 46bca07 commit f46f81b

File tree

7 files changed

+208
-5
lines changed

7 files changed

+208
-5
lines changed

.apigentools-info

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
"spec_versions": {
55
"v1": {
66
"apigentools_version": "1.6.5",
7-
"regenerated": "2023-09-12 20:28:32.678363",
8-
"spec_repo_commit": "bc2ae18f"
7+
"regenerated": "2023-09-13 14:37:22.996999",
8+
"spec_repo_commit": "ec46249d"
99
},
1010
"v2": {
1111
"apigentools_version": "1.6.5",
12-
"regenerated": "2023-09-12 20:28:32.694366",
13-
"spec_repo_commit": "bc2ae18f"
12+
"regenerated": "2023-09-13 14:37:23.013431",
13+
"spec_repo_commit": "ec46249d"
1414
}
1515
}
1616
}

.generator/schemas/v1/openapi.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3422,6 +3422,11 @@ components:
34223422
$ref: '#/components/schemas/LogQueryDefinition'
34233423
event_query:
34243424
$ref: '#/components/schemas/EventQueryDefinition'
3425+
formulas:
3426+
description: List of formulas that operate on queries.
3427+
items:
3428+
$ref: '#/components/schemas/WidgetFormula'
3429+
type: array
34253430
log_query:
34263431
$ref: '#/components/schemas/LogQueryDefinition'
34273432
network_query:
@@ -3433,6 +3438,13 @@ components:
34333438
q:
34343439
description: Widget query.
34353440
type: string
3441+
queries:
3442+
description: List of queries that can be returned directly or used in formulas.
3443+
items:
3444+
$ref: '#/components/schemas/FormulaAndFunctionQueryDefinition'
3445+
type: array
3446+
response_format:
3447+
$ref: '#/components/schemas/FormulaAndFunctionResponseFormat'
34363448
rum_query:
34373449
$ref: '#/components/schemas/LogQueryDefinition'
34383450
security_query:
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
"""
2+
Create a new dashboard with formula and function heatmap widget
3+
"""
4+
5+
from datadog_api_client import ApiClient, Configuration
6+
from datadog_api_client.v1.api.dashboards_api import DashboardsApi
7+
from datadog_api_client.v1.model.dashboard import Dashboard
8+
from datadog_api_client.v1.model.dashboard_layout_type import DashboardLayoutType
9+
from datadog_api_client.v1.model.formula_and_function_metric_data_source import FormulaAndFunctionMetricDataSource
10+
from datadog_api_client.v1.model.formula_and_function_metric_query_definition import (
11+
FormulaAndFunctionMetricQueryDefinition,
12+
)
13+
from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat
14+
from datadog_api_client.v1.model.heat_map_widget_definition import HeatMapWidgetDefinition
15+
from datadog_api_client.v1.model.heat_map_widget_definition_type import HeatMapWidgetDefinitionType
16+
from datadog_api_client.v1.model.heat_map_widget_request import HeatMapWidgetRequest
17+
from datadog_api_client.v1.model.widget import Widget
18+
from datadog_api_client.v1.model.widget_formula import WidgetFormula
19+
from datadog_api_client.v1.model.widget_layout import WidgetLayout
20+
from datadog_api_client.v1.model.widget_style import WidgetStyle
21+
from datadog_api_client.v1.model.widget_text_align import WidgetTextAlign
22+
from datadog_api_client.v1.model.widget_time import WidgetTime
23+
24+
body = Dashboard(
25+
title="Example-Dashboard",
26+
widgets=[
27+
Widget(
28+
layout=WidgetLayout(
29+
x=0,
30+
y=0,
31+
width=47,
32+
height=15,
33+
),
34+
definition=HeatMapWidgetDefinition(
35+
title="",
36+
title_size="16",
37+
title_align=WidgetTextAlign.LEFT,
38+
time=WidgetTime(),
39+
type=HeatMapWidgetDefinitionType.HEATMAP,
40+
requests=[
41+
HeatMapWidgetRequest(
42+
response_format=FormulaAndFunctionResponseFormat.TIMESERIES,
43+
queries=[
44+
FormulaAndFunctionMetricQueryDefinition(
45+
data_source=FormulaAndFunctionMetricDataSource.METRICS,
46+
name="query1",
47+
query="avg:system.cpu.user{*}",
48+
),
49+
],
50+
formulas=[
51+
WidgetFormula(
52+
formula="query1",
53+
),
54+
],
55+
style=WidgetStyle(
56+
palette="dog_classic",
57+
),
58+
),
59+
],
60+
),
61+
),
62+
],
63+
template_variables=[],
64+
layout_type=DashboardLayoutType.FREE,
65+
is_read_only=False,
66+
notify_list=[],
67+
)
68+
69+
configuration = Configuration()
70+
with ApiClient(configuration) as api_client:
71+
api_instance = DashboardsApi(api_client)
72+
response = api_instance.create_dashboard(body=body)
73+
74+
print(response)

src/datadog_api_client/v1/model/heat_map_widget_request.py

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Copyright 2019-Present Datadog, Inc.
44
from __future__ import annotations
55

6-
from typing import Union, TYPE_CHECKING
6+
from typing import List, Union, TYPE_CHECKING
77

88
from datadog_api_client.model_utils import (
99
ModelNormal,
@@ -16,26 +16,56 @@
1616
if TYPE_CHECKING:
1717
from datadog_api_client.v1.model.log_query_definition import LogQueryDefinition
1818
from datadog_api_client.v1.model.event_query_definition import EventQueryDefinition
19+
from datadog_api_client.v1.model.widget_formula import WidgetFormula
1920
from datadog_api_client.v1.model.process_query_definition import ProcessQueryDefinition
21+
from datadog_api_client.v1.model.formula_and_function_query_definition import FormulaAndFunctionQueryDefinition
22+
from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat
2023
from datadog_api_client.v1.model.widget_style import WidgetStyle
24+
from datadog_api_client.v1.model.formula_and_function_metric_query_definition import (
25+
FormulaAndFunctionMetricQueryDefinition,
26+
)
27+
from datadog_api_client.v1.model.formula_and_function_event_query_definition import (
28+
FormulaAndFunctionEventQueryDefinition,
29+
)
30+
from datadog_api_client.v1.model.formula_and_function_process_query_definition import (
31+
FormulaAndFunctionProcessQueryDefinition,
32+
)
33+
from datadog_api_client.v1.model.formula_and_function_apm_dependency_stats_query_definition import (
34+
FormulaAndFunctionApmDependencyStatsQueryDefinition,
35+
)
36+
from datadog_api_client.v1.model.formula_and_function_apm_resource_stats_query_definition import (
37+
FormulaAndFunctionApmResourceStatsQueryDefinition,
38+
)
39+
from datadog_api_client.v1.model.formula_and_function_slo_query_definition import (
40+
FormulaAndFunctionSLOQueryDefinition,
41+
)
42+
from datadog_api_client.v1.model.formula_and_function_cloud_cost_query_definition import (
43+
FormulaAndFunctionCloudCostQueryDefinition,
44+
)
2145

2246

2347
class HeatMapWidgetRequest(ModelNormal):
2448
@cached_property
2549
def openapi_types(_):
2650
from datadog_api_client.v1.model.log_query_definition import LogQueryDefinition
2751
from datadog_api_client.v1.model.event_query_definition import EventQueryDefinition
52+
from datadog_api_client.v1.model.widget_formula import WidgetFormula
2853
from datadog_api_client.v1.model.process_query_definition import ProcessQueryDefinition
54+
from datadog_api_client.v1.model.formula_and_function_query_definition import FormulaAndFunctionQueryDefinition
55+
from datadog_api_client.v1.model.formula_and_function_response_format import FormulaAndFunctionResponseFormat
2956
from datadog_api_client.v1.model.widget_style import WidgetStyle
3057

3158
return {
3259
"apm_query": (LogQueryDefinition,),
3360
"event_query": (EventQueryDefinition,),
61+
"formulas": ([WidgetFormula],),
3462
"log_query": (LogQueryDefinition,),
3563
"network_query": (LogQueryDefinition,),
3664
"process_query": (ProcessQueryDefinition,),
3765
"profile_metrics_query": (LogQueryDefinition,),
3866
"q": (str,),
67+
"queries": ([FormulaAndFunctionQueryDefinition],),
68+
"response_format": (FormulaAndFunctionResponseFormat,),
3969
"rum_query": (LogQueryDefinition,),
4070
"security_query": (LogQueryDefinition,),
4171
"style": (WidgetStyle,),
@@ -44,11 +74,14 @@ def openapi_types(_):
4474
attribute_map = {
4575
"apm_query": "apm_query",
4676
"event_query": "event_query",
77+
"formulas": "formulas",
4778
"log_query": "log_query",
4879
"network_query": "network_query",
4980
"process_query": "process_query",
5081
"profile_metrics_query": "profile_metrics_query",
5182
"q": "q",
83+
"queries": "queries",
84+
"response_format": "response_format",
5285
"rum_query": "rum_query",
5386
"security_query": "security_query",
5487
"style": "style",
@@ -58,11 +91,28 @@ def __init__(
5891
self_,
5992
apm_query: Union[LogQueryDefinition, UnsetType] = unset,
6093
event_query: Union[EventQueryDefinition, UnsetType] = unset,
94+
formulas: Union[List[WidgetFormula], UnsetType] = unset,
6195
log_query: Union[LogQueryDefinition, UnsetType] = unset,
6296
network_query: Union[LogQueryDefinition, UnsetType] = unset,
6397
process_query: Union[ProcessQueryDefinition, UnsetType] = unset,
6498
profile_metrics_query: Union[LogQueryDefinition, UnsetType] = unset,
6599
q: Union[str, UnsetType] = unset,
100+
queries: Union[
101+
List[
102+
Union[
103+
FormulaAndFunctionQueryDefinition,
104+
FormulaAndFunctionMetricQueryDefinition,
105+
FormulaAndFunctionEventQueryDefinition,
106+
FormulaAndFunctionProcessQueryDefinition,
107+
FormulaAndFunctionApmDependencyStatsQueryDefinition,
108+
FormulaAndFunctionApmResourceStatsQueryDefinition,
109+
FormulaAndFunctionSLOQueryDefinition,
110+
FormulaAndFunctionCloudCostQueryDefinition,
111+
]
112+
],
113+
UnsetType,
114+
] = unset,
115+
response_format: Union[FormulaAndFunctionResponseFormat, UnsetType] = unset,
66116
rum_query: Union[LogQueryDefinition, UnsetType] = unset,
67117
security_query: Union[LogQueryDefinition, UnsetType] = unset,
68118
style: Union[WidgetStyle, UnsetType] = unset,
@@ -77,6 +127,9 @@ def __init__(
77127
:param event_query: The event query.
78128
:type event_query: EventQueryDefinition, optional
79129
130+
:param formulas: List of formulas that operate on queries.
131+
:type formulas: [WidgetFormula], optional
132+
80133
:param log_query: The log query.
81134
:type log_query: LogQueryDefinition, optional
82135
@@ -92,6 +145,12 @@ def __init__(
92145
:param q: Widget query.
93146
:type q: str, optional
94147
148+
:param queries: List of queries that can be returned directly or used in formulas.
149+
:type queries: [FormulaAndFunctionQueryDefinition], optional
150+
151+
:param response_format: Timeseries, scalar, or event list response. Event list response formats are supported by Geomap widgets.
152+
:type response_format: FormulaAndFunctionResponseFormat, optional
153+
95154
:param rum_query: The log query.
96155
:type rum_query: LogQueryDefinition, optional
97156
@@ -105,6 +164,8 @@ def __init__(
105164
kwargs["apm_query"] = apm_query
106165
if event_query is not unset:
107166
kwargs["event_query"] = event_query
167+
if formulas is not unset:
168+
kwargs["formulas"] = formulas
108169
if log_query is not unset:
109170
kwargs["log_query"] = log_query
110171
if network_query is not unset:
@@ -115,6 +176,10 @@ def __init__(
115176
kwargs["profile_metrics_query"] = profile_metrics_query
116177
if q is not unset:
117178
kwargs["q"] = q
179+
if queries is not unset:
180+
kwargs["queries"] = queries
181+
if response_format is not unset:
182+
kwargs["response_format"] = response_format
118183
if rum_query is not unset:
119184
kwargs["rum_query"] = rum_query
120185
if security_query is not unset:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2023-09-12T19:51:40.932Z
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
interactions:
2+
- request:
3+
body: '{"is_read_only":false,"layout_type":"free","notify_list":[],"template_variables":[],"title":"Test-Create_a_new_dashboard_with_formula_and_function_heatmap_widget-1694548300","widgets":[{"definition":{"requests":[{"formulas":[{"formula":"query1"}],"queries":[{"data_source":"metrics","name":"query1","query":"avg:system.cpu.user{*}"}],"response_format":"timeseries","style":{"palette":"dog_classic"}}],"time":{},"title":"","title_align":"left","title_size":"16","type":"heatmap"},"layout":{"height":15,"width":47,"x":0,"y":0}}]}'
4+
headers:
5+
accept:
6+
- application/json
7+
content-type:
8+
- application/json
9+
method: POST
10+
uri: https://api.datadoghq.com/api/v1/dashboard
11+
response:
12+
body:
13+
string: '{"id":"agm-reh-km8","title":"Test-Create_a_new_dashboard_with_formula_and_function_heatmap_widget-1694548300","description":null,"author_handle":"[email protected]","author_name":null,"layout_type":"free","url":"/dashboard/agm-reh-km8/test-createanewdashboardwithformulaandfunctionheatmapwidget-1694548300","is_read_only":false,"template_variables":[],"widgets":[{"definition":{"requests":[{"formulas":[{"formula":"query1"}],"queries":[{"data_source":"metrics","name":"query1","query":"avg:system.cpu.user{*}"}],"response_format":"timeseries","style":{"palette":"dog_classic"}}],"time":{},"title":"","title_align":"left","title_size":"16","type":"heatmap"},"layout":{"height":15,"width":47,"x":0,"y":0},"id":658874190518028}],"notify_list":[],"created_at":"2023-09-12T19:51:41.163760+00:00","modified_at":"2023-09-12T19:51:41.163760+00:00","restricted_roles":[]}
14+
15+
'
16+
headers:
17+
content-type:
18+
- application/json
19+
status:
20+
code: 200
21+
message: OK
22+
- request:
23+
body: null
24+
headers:
25+
accept:
26+
- application/json
27+
method: DELETE
28+
uri: https://api.datadoghq.com/api/v1/dashboard/agm-reh-km8
29+
response:
30+
body:
31+
string: '{"deleted_dashboard_id":"agm-reh-km8"}
32+
33+
'
34+
headers:
35+
content-type:
36+
- application/json
37+
status:
38+
code: 200
39+
message: OK
40+
version: 1

tests/v1/features/dashboards.feature

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,17 @@ Feature: Dashboards
324324
And the response "widgets[0].definition.type" is equal to "event_timeline"
325325
And the response "widgets[0].definition.query" is equal to "status:error priority:all"
326326

327+
@team:DataDog/dashboards-backend
328+
Scenario: Create a new dashboard with formula and function heatmap widget
329+
Given new "CreateDashboard" request
330+
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": "heatmap", "requests": [{"response_format": "timeseries", "queries": [{"data_source": "metrics", "name": "query1", "query": "avg:system.cpu.user{*}"}], "formulas": [{"formula": "query1"}], "style": {"palette": "dog_classic"}}]}}], "template_variables": [], "layout_type": "free", "is_read_only": false, "notify_list": []}
331+
When the request is sent
332+
Then the response status is 200 OK
333+
And the response "widgets[0].definition.type" is equal to "heatmap"
334+
And the response "widgets[0].definition.requests[0].queries[0].query" is equal to "avg:system.cpu.user{*}"
335+
And the response "widgets[0].definition.requests[0].queries[0].data_source" is equal to "metrics"
336+
And the response "widgets[0].definition.requests[0].style.palette" is equal to "dog_classic"
337+
327338
@team:DataDog/dashboards-backend
328339
Scenario: Create a new dashboard with formulas and functions scatterplot widget
329340
Given new "CreateDashboard" request

0 commit comments

Comments
 (0)