From e40cee5e9a8a6699db1af5a3817e46b19db8f414 Mon Sep 17 00:00:00 2001 From: "api-clients-generation-pipeline[bot]" <54105614+api-clients-generation-pipeline[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 16:28:06 +0000 Subject: [PATCH 1/4] Document LLM Observability span search and data deletion endpoints (#3360) Co-authored-by: ci.datadog-api-spec --- .generator/schemas/v2/openapi.yaml | 845 +++++++++++++++++- .../v2/llm-observability/DeleteLLMObsData.rb | 22 + .../v2/llm-observability/ListLLMObsSpans.rb | 8 + .../v2/llm-observability/SearchLLMObsSpans.rb | 35 + features/scenarios_model_mapping.rb | 20 + features/v2/llm_observability.feature | 50 +- features/v2/undo.json | 20 + lib/datadog_api_client/configuration.rb | 3 + lib/datadog_api_client/inflector.rb | 28 + .../v2/api/llm_observability_api.rb | 236 +++++ .../models/llm_obs_data_deletion_request.rb | 123 +++ ...lm_obs_data_deletion_request_attributes.rb | 175 ++++ .../llm_obs_data_deletion_request_data.rb | 144 +++ .../llm_obs_data_deletion_request_type.rb | 26 + .../models/llm_obs_data_deletion_response.rb | 123 +++ ...m_obs_data_deletion_response_attributes.rb | 249 ++++++ .../llm_obs_data_deletion_response_data.rb | 165 ++++ .../llm_obs_data_deletion_response_type.rb | 26 + .../v2/models/llm_obs_search_spans_request.rb | 123 +++ ...llm_obs_search_spans_request_attributes.rb | 135 +++ .../llm_obs_search_spans_request_data.rb | 144 +++ .../llm_obs_search_spans_request_type.rb | 26 + .../v2/models/llm_obs_span_attributes.rb | 384 ++++++++ .../v2/models/llm_obs_span_data.rb | 165 ++++ .../models/llm_obs_span_evaluation_metric.rb | 157 ++++ .../v2/models/llm_obs_span_filter.rb | 185 ++++ .../v2/models/llm_obs_span_io.rb | 117 +++ .../v2/models/llm_obs_span_message.rb | 149 +++ .../v2/models/llm_obs_span_page_query.rb | 115 +++ .../v2/models/llm_obs_span_search_options.rb | 115 +++ .../v2/models/llm_obs_span_tool_call.rb | 135 +++ .../v2/models/llm_obs_span_tool_definition.rb | 135 +++ .../v2/models/llm_obs_span_tool_result.rb | 135 +++ .../v2/models/llm_obs_span_type.rb | 26 + .../v2/models/llm_obs_spans_response.rb | 156 ++++ .../v2/models/llm_obs_spans_response_links.rb | 105 +++ .../v2/models/llm_obs_spans_response_meta.rb | 186 ++++ .../v2/models/llm_obs_spans_response_page.rb | 105 +++ 38 files changed, 5093 insertions(+), 3 deletions(-) create mode 100644 examples/v2/llm-observability/DeleteLLMObsData.rb create mode 100644 examples/v2/llm-observability/ListLLMObsSpans.rb create mode 100644 examples/v2/llm-observability/SearchLLMObsSpans.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_request.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_attributes.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_data.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_type.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_response.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_attributes.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_data.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_type.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_search_spans_request.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_search_spans_request_attributes.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_search_spans_request_data.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_search_spans_request_type.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_attributes.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_data.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_evaluation_metric.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_filter.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_io.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_message.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_page_query.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_search_options.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_tool_call.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_tool_definition.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_tool_result.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_span_type.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_spans_response.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_spans_response_links.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_spans_response_meta.rb create mode 100644 lib/datadog_api_client/v2/models/llm_obs_spans_response_page.rb diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 901b7a232478..ac098a3c305d 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -42437,6 +42437,139 @@ components: example: "my-gcp-project" type: string type: object + LLMObsDataDeletionRequest: + description: Request to delete LLM Observability data. + properties: + data: + $ref: "#/components/schemas/LLMObsDataDeletionRequestData" + required: + - data + type: object + LLMObsDataDeletionRequestAttributes: + description: Attributes for an LLM Observability data deletion request. + properties: + delay: + description: Optional delay in seconds before the deletion is executed. + example: 0 + format: int64 + type: integer + from: + description: Start of the deletion time range in milliseconds since Unix epoch. + example: 1705314600000 + format: int64 + type: integer + query: + additionalProperties: + type: string + description: Query filters selecting the data to delete. Must include a `query` key with an `@trace_id` filter. + example: + query: "@trace_id:abc123def456" + type: object + to: + description: End of the deletion time range in milliseconds since Unix epoch. + example: 1705315200000 + format: int64 + type: integer + required: + - query + - from + - to + type: object + LLMObsDataDeletionRequestData: + description: Data object for an LLM Observability data deletion request. + properties: + attributes: + $ref: "#/components/schemas/LLMObsDataDeletionRequestAttributes" + type: + $ref: "#/components/schemas/LLMObsDataDeletionRequestType" + required: + - type + - attributes + type: object + LLMObsDataDeletionRequestType: + description: Resource type for an LLM Observability data deletion request. + enum: + - create_deletion_req + example: create_deletion_req + type: string + x-enum-varnames: + - CREATE_DELETION_REQ + LLMObsDataDeletionResponse: + description: Response containing details of a submitted LLM Observability data deletion request. + properties: + data: + $ref: "#/components/schemas/LLMObsDataDeletionResponseData" + required: + - data + type: object + LLMObsDataDeletionResponseAttributes: + description: Attributes of a submitted LLM Observability data deletion request. + properties: + created_at: + description: Timestamp when the deletion request was created. + example: "2024-01-15T10:30:00Z" + format: date-time + type: string + created_by: + description: UUID of the user who created the deletion request. + example: "user-uuid-1234" + type: string + from_time: + description: Start of the deletion time range in milliseconds since Unix epoch. + example: 1705314600000 + format: int64 + type: integer + org_id: + description: ID of the organization that submitted the deletion request. + example: 12345 + format: int64 + type: integer + product: + description: Product name for the deletion request. + example: "llmobs" + type: string + query: + description: The query string used to select data for deletion. + example: "@trace_id:abc123def456" + type: string + to_time: + description: End of the deletion time range in milliseconds since Unix epoch. + example: 1705315200000 + format: int64 + type: integer + required: + - org_id + - product + - created_at + - created_by + - from_time + - to_time + - query + type: object + LLMObsDataDeletionResponseData: + description: Data object for an LLM Observability data deletion response. + properties: + attributes: + $ref: "#/components/schemas/LLMObsDataDeletionResponseAttributes" + id: + description: Unique identifier of the deletion request. + example: "msg-abc123" + type: string + type: + $ref: "#/components/schemas/LLMObsDataDeletionResponseType" + required: + - id + - type + - attributes + type: object + LLMObsDataDeletionResponseType: + description: Resource type for an LLM Observability data deletion response. + enum: + - deletion_request + example: deletion_request + type: string + x-enum-varnames: + - DELETION_REQUEST LLMObsDatasetDataAttributesRequest: description: Attributes for creating an LLM Observability dataset. properties: @@ -44312,6 +44445,395 @@ components: type: string x-enum-varnames: - RECORDS + LLMObsSearchSpansRequest: + description: Request body for searching LLM Observability spans. + properties: + data: + $ref: "#/components/schemas/LLMObsSearchSpansRequestData" + required: + - data + type: object + LLMObsSearchSpansRequestAttributes: + description: Attributes of an LLM Observability spans search request. + properties: + filter: + $ref: "#/components/schemas/LLMObsSpanFilter" + options: + $ref: "#/components/schemas/LLMObsSpanSearchOptions" + page: + $ref: "#/components/schemas/LLMObsSpanPageQuery" + sort: + description: Sort order for the results. Use `-` prefix for descending order. + example: "-start_ns" + type: string + type: object + LLMObsSearchSpansRequestData: + description: Data object for an LLM Observability spans search request. + properties: + attributes: + $ref: "#/components/schemas/LLMObsSearchSpansRequestAttributes" + type: + $ref: "#/components/schemas/LLMObsSearchSpansRequestType" + required: + - type + - attributes + type: object + LLMObsSearchSpansRequestType: + description: Resource type for an LLM Observability spans search request. + enum: + - spans + example: spans + type: string + x-enum-varnames: + - SPANS + LLMObsSpanAttributes: + description: Attributes of an LLM Observability span. + properties: + duration: + description: Duration of the span in nanoseconds. + example: 1500000000.0 + format: double + type: number + evaluation: + additionalProperties: + $ref: "#/components/schemas/LLMObsSpanEvaluationMetric" + description: Evaluation metrics keyed by evaluator name. + type: object + input: + $ref: "#/components/schemas/LLMObsSpanIO" + intent: + description: Detected intent of the span. + type: string + metadata: + additionalProperties: {} + description: Arbitrary metadata associated with the span. + type: object + metrics: + additionalProperties: + format: double + type: number + description: Numeric metrics associated with the span (e.g., token counts). + type: object + ml_app: + description: Name of the ML application this span belongs to. + example: "my-llm-app" + type: string + model_name: + description: Name of the model used in this span. + example: "gpt-4o" + type: string + model_provider: + description: Provider of the model used in this span. + example: "openai" + type: string + name: + description: Name of the span. + example: "llm_call" + type: string + output: + $ref: "#/components/schemas/LLMObsSpanIO" + parent_id: + description: Identifier of the parent span, if any. + type: string + span_id: + description: Unique identifier of the span. + example: "abc123def456" + type: string + span_kind: + description: Kind of span (e.g., llm, agent, tool, task, workflow). + example: "llm" + type: string + start_ns: + description: Start time of the span in nanoseconds since Unix epoch. + example: 1705314600000000000 + format: int64 + type: integer + status: + description: Status of the span (e.g., ok, error). + example: "ok" + type: string + tags: + description: Tags associated with the span. + items: + type: string + type: array + tool_definitions: + description: Tool definitions available to the span. + items: + $ref: "#/components/schemas/LLMObsSpanToolDefinition" + type: array + trace_id: + description: Trace identifier this span belongs to. + example: "trace-9a8b7c6d5e4f" + type: string + required: + - span_id + - trace_id + - name + - status + - start_ns + - duration + - ml_app + - span_kind + type: object + LLMObsSpanData: + description: A single LLM Observability span. + properties: + attributes: + $ref: "#/components/schemas/LLMObsSpanAttributes" + id: + description: Unique identifier of the span. + example: "abc123def456" + type: string + type: + $ref: "#/components/schemas/LLMObsSpanType" + required: + - id + - type + - attributes + type: object + LLMObsSpanEvaluationMetric: + description: An evaluation metric associated with an LLM Observability span. + properties: + assessment: + description: Assessment result (e.g., pass or fail). + example: pass + type: string + eval_metric_type: + description: Type of the evaluation metric (e.g., score, categorical, boolean). + example: score + type: string + reasoning: + description: Human-readable reasoning for the evaluation result. + type: string + status: + description: Status of the evaluation execution. + type: string + tags: + description: Tags associated with the evaluation metric. + items: + type: string + type: array + value: + description: Value of the evaluation result. + type: object + LLMObsSpanFilter: + description: Filter criteria for an LLM Observability span search. + properties: + from: + description: Start of the time range. Accepts ISO 8601 or relative format (e.g., `now-15m`). Defaults to `now-15m`. + example: "now-900s" + type: string + ml_app: + description: Filter by ML application name. + example: "my-llm-app" + type: string + query: + description: >- + Search query using LLM Observability query syntax. Supports attribute filters using the field:value syntax (e.g. session_id, trace_id, ml_app, meta.span.kind). When provided, structured field filters (`span_id`, `trace_id`, etc.) are ignored. + example: "@session_id:abc123def456" + type: string + span_id: + description: Filter by exact span ID. + example: "abc123def456" + type: string + span_kind: + description: Filter by span kind (e.g., llm, agent, tool, task, workflow). + example: "llm" + type: string + span_name: + description: Filter by span name. + example: "llm_call" + type: string + tags: + additionalProperties: + type: string + description: Filter by tag key-value pairs. + type: object + to: + description: End of the time range. Accepts ISO 8601 or relative format (e.g., `now`). Defaults to `now`. + example: "now" + type: string + trace_id: + description: Filter by exact trace ID. + example: "trace-9a8b7c6d5e4f" + type: string + type: object + LLMObsSpanIO: + description: Input or output content of an LLM Observability span. + properties: + messages: + description: List of messages in the input or output. + items: + $ref: "#/components/schemas/LLMObsSpanMessage" + type: array + value: + description: Plain-text value of the input or output. + type: string + type: object + LLMObsSpanMessage: + description: A single message in a span input or output. + properties: + content: + description: Text content of the message. + type: string + id: + description: Unique identifier of the message. + type: string + role: + description: Role of the message sender (e.g., user, assistant, system). + type: string + tool_calls: + description: Tool calls made in this message. + items: + $ref: "#/components/schemas/LLMObsSpanToolCall" + type: array + tool_results: + description: Tool results returned in this message. + items: + $ref: "#/components/schemas/LLMObsSpanToolResult" + type: array + type: object + LLMObsSpanPageQuery: + description: Pagination settings for a span search request. + properties: + cursor: + description: Cursor from the previous response to retrieve the next page. + example: "eyJzdGFydCI6MTAwfQ==" + type: string + limit: + description: Maximum number of spans to return. Defaults to `10`. + example: 10 + format: int64 + type: integer + type: object + LLMObsSpanSearchOptions: + description: Additional options for a span search request. + properties: + include_attachments: + description: Whether to include attachment data in the response. Defaults to `true`. + example: true + type: boolean + time_offset: + description: Offset in seconds applied to both `from` and `to` timestamps. + example: 0 + format: int64 + type: integer + type: object + LLMObsSpanToolCall: + description: A tool call made during a span. + properties: + arguments: + additionalProperties: {} + description: Arguments passed to the tool. + type: object + name: + description: Name of the tool called. + type: string + tool_id: + description: Identifier of the tool call. + type: string + type: + description: Type of the tool call. + type: string + type: object + LLMObsSpanToolDefinition: + description: A tool definition available to an LLM span. + properties: + description: + description: Description of what the tool does. + type: string + name: + description: Name of the tool. + type: string + schema: + additionalProperties: {} + description: JSON schema describing the tool's input parameters. + type: object + version: + description: Version of the tool definition. + type: string + type: object + LLMObsSpanToolResult: + description: A result returned from a tool call during a span. + properties: + name: + description: Name of the tool that produced this result. + type: string + result: + description: Result value returned by the tool. + type: string + tool_id: + description: Identifier of the corresponding tool call. + type: string + type: + description: Type of the tool result. + type: string + type: object + LLMObsSpanType: + description: Resource type for an LLM Observability span. + enum: + - span + example: span + type: string + x-enum-varnames: + - SPAN + LLMObsSpansResponse: + description: Response containing a list of LLM Observability spans. + properties: + data: + description: List of spans matching the query. + items: + $ref: "#/components/schemas/LLMObsSpanData" + type: array + links: + $ref: "#/components/schemas/LLMObsSpansResponseLinks" + meta: + $ref: "#/components/schemas/LLMObsSpansResponseMeta" + required: + - data + - meta + type: object + LLMObsSpansResponseLinks: + description: Pagination links accompanying the spans response. + properties: + next: + description: URL to retrieve the next page of results. + example: "https://api.datadoghq.com/api/v2/llm-obs/v1/spans/events?page[cursor]=eyJzdGFydCI6MTAwfQ==" + type: string + type: object + LLMObsSpansResponseMeta: + description: Metadata accompanying the spans response. + properties: + elapsed: + description: Time elapsed for the query in milliseconds. + example: 132 + format: int64 + type: integer + page: + $ref: "#/components/schemas/LLMObsSpansResponsePage" + request_id: + description: Unique identifier for the request. + example: "req-abc123" + type: string + status: + description: Status of the query execution. + example: "done" + type: string + required: + - elapsed + - request_id + - status + - page + type: object + LLMObsSpansResponsePage: + description: Pagination cursor for the spans response. + properties: + after: + description: Cursor to retrieve the next page of results. Absent when there are no more results. + example: "eyJzdGFydCI6MTAwfQ==" + type: string + type: object LLMObsTraceAnnotatedInteractionItem: description: A trace, experiment trace, or session interaction with its associated annotations. properties: @@ -119398,6 +119920,77 @@ paths: operator: OR permissions: - org_management + /api/v2/llm-obs/deletion/data/llmobs: + post: + description: Submit a request to delete LLM Observability span data matching a trace ID filter within a specified time range. + operationId: DeleteLLMObsData + requestBody: + content: + application/json: + examples: + default: + value: + data: + attributes: + from: 1705314600000 + query: + query: "@trace_id:abc123def456" + to: 1705315200000 + type: create_deletion_req + schema: + $ref: "#/components/schemas/LLMObsDataDeletionRequest" + description: Data deletion request payload. + required: true + responses: + "202": + content: + application/json: + examples: + default: + value: + data: + attributes: + created_at: "2024-01-15T10:30:00Z" + created_by: "user-uuid-1234" + from_time: 1705314600000 + org_id: 12345 + product: llmobs + query: "@trace_id:abc123def456" + to_time: 1705315200000 + id: msg-abc123 + type: deletion_request + schema: + $ref: "#/components/schemas/LLMObsDataDeletionResponse" + description: Accepted + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Bad Request + "401": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Unauthorized + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + summary: Delete LLM Observability data + tags: + - LLM Observability + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). /api/v2/llm-obs/v1/annotation-queues: get: description: |- @@ -121071,6 +121664,256 @@ paths: x-unstable: |- **Note**: This endpoint is in preview and is subject to change. If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). + /api/v2/llm-obs/v1/spans/events: + get: + description: List LLM Observability spans matching the specified filters. + operationId: ListLLMObsSpans + parameters: + - description: Start of the time range. Accepts ISO 8601 or relative format (e.g., `now-15m`). Defaults to `now-15m`. + in: query + name: filter[from] + schema: + example: "now-900s" + type: string + - description: End of the time range. Accepts ISO 8601 or relative format. Defaults to `now`. + in: query + name: filter[to] + schema: + example: "now" + type: string + - description: >- + Search query using LLM Observability query syntax. Supports attribute filters using the field:value syntax (e.g. session_id, trace_id, ml_app, meta.span.kind). When provided, structured field filters (`filter[span_id]`, `filter[trace_id]`, etc.) are ignored. + in: query + name: filter[query] + schema: + example: "@session_id:abc123def456" + type: string + - description: Filter by exact span ID. + in: query + name: filter[span_id] + schema: + type: string + - description: Filter by exact trace ID. + in: query + name: filter[trace_id] + schema: + type: string + - description: Filter by span kind (e.g., llm, agent, tool, task, workflow). + in: query + name: filter[span_kind] + schema: + type: string + - description: Filter by span name. + in: query + name: filter[span_name] + schema: + type: string + - description: Filter by ML application name. + in: query + name: filter[ml_app] + schema: + type: string + - description: Maximum number of spans to return. Defaults to `10`. + in: query + name: page[limit] + schema: + format: int64 + type: integer + - description: Cursor from the previous response to retrieve the next page. + in: query + name: page[cursor] + schema: + type: string + - description: Sort order for the results. + in: query + name: sort + schema: + type: string + - description: Whether to include attachment data in the response. Defaults to `true`. + in: query + name: include_attachments + schema: + type: boolean + responses: + "200": + content: + application/json: + examples: + default: + summary: List spans for an ML app + value: + data: + - attributes: + duration: 1500000000.0 + ml_app: my-llm-app + model_name: gpt-4o + model_provider: openai + name: llm_call + span_id: "abc123def456" + span_kind: llm + start_ns: 1705314600000000000 + status: ok + trace_id: "trace-9a8b7c6d5e4f" + id: "abc123def456" + type: span + meta: + elapsed: 132 + page: {} + request_id: req-abc123 + status: done + session_id: + summary: List spans filtered by session ID + value: + data: + - attributes: + duration: 1500000000.0 + ml_app: my-llm-app + name: llm_call + span_id: "abc123def456" + span_kind: llm + start_ns: 1705314600000000000 + status: ok + tags: + - "session_id:abc123def456" + trace_id: "trace-9a8b7c6d5e4f" + id: "abc123def456" + type: span + meta: + elapsed: 87 + page: {} + request_id: req-def456 + status: done + schema: + $ref: "#/components/schemas/LLMObsSpansResponse" + description: OK + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Bad Request + "401": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Unauthorized + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + summary: List LLM Observability spans + tags: + - LLM Observability + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). + /api/v2/llm-obs/v1/spans/events/search: + post: + description: Search LLM Observability spans using structured filters in the request body. + operationId: SearchLLMObsSpans + requestBody: + content: + application/json: + examples: + default: + summary: Search spans for an ML app + value: + data: + attributes: + filter: + from: "now-900s" + ml_app: "my-llm-app" + span_kind: "llm" + to: "now" + options: + include_attachments: true + page: + limit: 10 + type: spans + session_id: + summary: Search all spans in a session + value: + data: + attributes: + filter: + from: "now-900s" + query: "@session_id:abc123def456" + to: "now" + options: + include_attachments: true + page: + limit: 50 + type: spans + schema: + $ref: "#/components/schemas/LLMObsSearchSpansRequest" + description: Search spans payload. + required: true + responses: + "200": + content: + application/json: + examples: + default: + value: + data: + - attributes: + duration: 1500000000.0 + ml_app: my-llm-app + model_name: gpt-4o + model_provider: openai + name: llm_call + span_id: "abc123def456" + span_kind: llm + start_ns: 1705314600000000000 + status: ok + trace_id: "trace-9a8b7c6d5e4f" + id: "abc123def456" + type: span + meta: + elapsed: 132 + page: {} + request_id: req-abc123 + status: done + schema: + $ref: "#/components/schemas/LLMObsSpansResponse" + description: OK + "400": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Bad Request + "401": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Unauthorized + "403": + content: + application/json: + schema: + $ref: "#/components/schemas/JSONAPIErrorResponse" + description: Forbidden + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - apiKeyAuth: [] + appKeyAuth: [] + summary: Search LLM Observability spans + tags: + - LLM Observability + x-unstable: |- + **Note**: This endpoint is in preview and is subject to change. + If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). /api/v2/llm-obs/v1/{project_id}/datasets: get: description: List all LLM Observability datasets for a project, sorted by creation date, newest first. @@ -157735,7 +158578,7 @@ tags: description: Find out more at url: "https://docs.datadoghq.com/account_management/api-app-keys/" name: Key Management - - description: Manage LLM Observability projects, datasets, dataset records, experiments, and annotations. + - description: Manage LLM Observability spans, data, projects, datasets, dataset records, experiments, and annotations. name: LLM Observability - description: |- Search your logs and send them to your Datadog platform over HTTP. See the [Log Management page](https://docs.datadoghq.com/logs/) for more information. diff --git a/examples/v2/llm-observability/DeleteLLMObsData.rb b/examples/v2/llm-observability/DeleteLLMObsData.rb new file mode 100644 index 000000000000..645bbcd977bb --- /dev/null +++ b/examples/v2/llm-observability/DeleteLLMObsData.rb @@ -0,0 +1,22 @@ +# Delete LLM Observability data returns "Accepted" response + +require "datadog_api_client" +DatadogAPIClient.configure do |config| + config.unstable_operations["v2.delete_llm_obs_data".to_sym] = true +end +api_instance = DatadogAPIClient::V2::LLMObservabilityAPI.new + +body = DatadogAPIClient::V2::LLMObsDataDeletionRequest.new({ + data: DatadogAPIClient::V2::LLMObsDataDeletionRequestData.new({ + attributes: DatadogAPIClient::V2::LLMObsDataDeletionRequestAttributes.new({ + delay: 0, + from: 1705314600000, + query: { + query: "@trace_id:abc123def456", + }, + to: 1705315200000, + }), + type: DatadogAPIClient::V2::LLMObsDataDeletionRequestType::CREATE_DELETION_REQ, + }), +}) +p api_instance.delete_llm_obs_data(body) diff --git a/examples/v2/llm-observability/ListLLMObsSpans.rb b/examples/v2/llm-observability/ListLLMObsSpans.rb new file mode 100644 index 000000000000..bcdeaaf4a89c --- /dev/null +++ b/examples/v2/llm-observability/ListLLMObsSpans.rb @@ -0,0 +1,8 @@ +# List LLM Observability spans returns "OK" response + +require "datadog_api_client" +DatadogAPIClient.configure do |config| + config.unstable_operations["v2.list_llm_obs_spans".to_sym] = true +end +api_instance = DatadogAPIClient::V2::LLMObservabilityAPI.new +p api_instance.list_llm_obs_spans() diff --git a/examples/v2/llm-observability/SearchLLMObsSpans.rb b/examples/v2/llm-observability/SearchLLMObsSpans.rb new file mode 100644 index 000000000000..194de4be8a62 --- /dev/null +++ b/examples/v2/llm-observability/SearchLLMObsSpans.rb @@ -0,0 +1,35 @@ +# Search LLM Observability spans returns "OK" response + +require "datadog_api_client" +DatadogAPIClient.configure do |config| + config.unstable_operations["v2.search_llm_obs_spans".to_sym] = true +end +api_instance = DatadogAPIClient::V2::LLMObservabilityAPI.new + +body = DatadogAPIClient::V2::LLMObsSearchSpansRequest.new({ + data: DatadogAPIClient::V2::LLMObsSearchSpansRequestData.new({ + attributes: DatadogAPIClient::V2::LLMObsSearchSpansRequestAttributes.new({ + filter: DatadogAPIClient::V2::LLMObsSpanFilter.new({ + from: "now-900s", + ml_app: "my-llm-app", + query: "@session_id:abc123def456", + span_id: "abc123def456", + span_kind: "llm", + span_name: "llm_call", + to: "now", + trace_id: "trace-9a8b7c6d5e4f", + }), + options: DatadogAPIClient::V2::LLMObsSpanSearchOptions.new({ + include_attachments: true, + time_offset: 0, + }), + page: DatadogAPIClient::V2::LLMObsSpanPageQuery.new({ + cursor: "eyJzdGFydCI6MTAwfQ==", + limit: 10, + }), + sort: "-start_ns", + }), + type: DatadogAPIClient::V2::LLMObsSearchSpansRequestType::SPANS, + }), +}) +p api_instance.search_llm_obs_spans(body) diff --git a/features/scenarios_model_mapping.rb b/features/scenarios_model_mapping.rb index 9fd6af3114f8..9246b6c3a9d0 100644 --- a/features/scenarios_model_mapping.rb +++ b/features/scenarios_model_mapping.rb @@ -919,6 +919,9 @@ "eval_name" => "String", "body" => "LLMObsCustomEvalConfigUpdateRequest", }, + "v2.DeleteLLMObsData" => { + "body" => "LLMObsDataDeletionRequest", + }, "v2.ListLLMObsAnnotationQueues" => { "project_id" => "String", "queue_ids" => "Array", @@ -997,6 +1000,23 @@ "project_id" => "String", "body" => "LLMObsProjectUpdateRequest", }, + "v2.ListLLMObsSpans" => { + "filter_from" => "String", + "filter_to" => "String", + "filter_query" => "String", + "filter_span_id" => "String", + "filter_trace_id" => "String", + "filter_span_kind" => "String", + "filter_span_name" => "String", + "filter_ml_app" => "String", + "page_limit" => "Integer", + "page_cursor" => "String", + "sort" => "String", + "include_attachments" => "Boolean", + }, + "v2.SearchLLMObsSpans" => { + "body" => "LLMObsSearchSpansRequest", + }, "v2.ListLLMObsDatasets" => { "project_id" => "String", "filter_name" => "String", diff --git a/features/v2/llm_observability.feature b/features/v2/llm_observability.feature index e8661824fd46..ec671390145d 100644 --- a/features/v2/llm_observability.feature +++ b/features/v2/llm_observability.feature @@ -1,7 +1,7 @@ @endpoint(llm-observability) @endpoint(llm-observability-v2) Feature: LLM Observability - Manage LLM Observability projects, datasets, dataset records, experiments, - and annotations. + Manage LLM Observability spans, data, projects, datasets, dataset records, + experiments, and annotations. Background: Given a valid "apiKeyAuth" key in the system @@ -245,6 +245,22 @@ Feature: LLM Observability When the request is sent Then the response status is 422 Unprocessable Entity + @generated @skip @team:DataDog/ml-observability + Scenario: Delete LLM Observability data returns "Accepted" response + Given operation "DeleteLLMObsData" enabled + And new "DeleteLLMObsData" request + And body with value {"data": {"attributes": {"delay": 0, "from": 1705314600000, "query": {"query": "@trace_id:abc123def456"}, "to": 1705315200000}, "type": "create_deletion_req"}} + When the request is sent + Then the response status is 202 Accepted + + @generated @skip @team:DataDog/ml-observability + Scenario: Delete LLM Observability data returns "Bad Request" response + Given operation "DeleteLLMObsData" enabled + And new "DeleteLLMObsData" request + And body with value {"data": {"attributes": {"delay": 0, "from": 1705314600000, "query": {"query": "@trace_id:abc123def456"}, "to": 1705315200000}, "type": "create_deletion_req"}} + When the request is sent + Then the response status is 400 Bad Request + @generated @skip @team:DataDog/ml-observability Scenario: Delete LLM Observability dataset records returns "Bad Request" response Given operation "DeleteLLMObsDatasetRecords" enabled @@ -558,6 +574,20 @@ Feature: LLM Observability When the request is sent Then the response status is 200 OK + @generated @skip @team:DataDog/ml-observability + Scenario: List LLM Observability spans returns "Bad Request" response + Given operation "ListLLMObsSpans" enabled + And new "ListLLMObsSpans" request + When the request is sent + Then the response status is 400 Bad Request + + @generated @skip @team:DataDog/ml-observability + Scenario: List LLM Observability spans returns "OK" response + Given operation "ListLLMObsSpans" enabled + And new "ListLLMObsSpans" request + When the request is sent + Then the response status is 200 OK + @generated @skip @team:DataDog/ml-observability Scenario: List events for an LLM Observability experiment returns "Bad Request" response Given operation "ListLLMObsExperimentEvents" enabled @@ -633,6 +663,22 @@ Feature: LLM Observability When the request is sent Then the response status is 206 Partial Content — more results are available. Use `meta.after` as the next `page.cursor`. + @generated @skip @team:DataDog/ml-observability + Scenario: Search LLM Observability spans returns "Bad Request" response + Given operation "SearchLLMObsSpans" enabled + And new "SearchLLMObsSpans" request + And body with value {"data": {"attributes": {"filter": {"from": "now-900s", "ml_app": "my-llm-app", "query": "@session_id:abc123def456", "span_id": "abc123def456", "span_kind": "llm", "span_name": "llm_call", "to": "now", "trace_id": "trace-9a8b7c6d5e4f"}, "options": {"include_attachments": true, "time_offset": 0}, "page": {"cursor": "eyJzdGFydCI6MTAwfQ==", "limit": 10}, "sort": "-start_ns"}, "type": "spans"}} + When the request is sent + Then the response status is 400 Bad Request + + @generated @skip @team:DataDog/ml-observability + Scenario: Search LLM Observability spans returns "OK" response + Given operation "SearchLLMObsSpans" enabled + And new "SearchLLMObsSpans" request + And body with value {"data": {"attributes": {"filter": {"from": "now-900s", "ml_app": "my-llm-app", "query": "@session_id:abc123def456", "span_id": "abc123def456", "span_kind": "llm", "span_name": "llm_call", "to": "now", "trace_id": "trace-9a8b7c6d5e4f"}, "options": {"include_attachments": true, "time_offset": 0}, "page": {"cursor": "eyJzdGFydCI6MTAwfQ==", "limit": 10}, "sort": "-start_ns"}, "type": "spans"}} + When the request is sent + Then the response status is 200 OK + @generated @skip @team:DataDog/ml-observability Scenario: Simple search experimentation entities returns "Bad Request" response Given operation "SimpleSearchLLMObsExperimentation" enabled diff --git a/features/v2/undo.json b/features/v2/undo.json index 1b8f5ec0b974..02753f1a80a7 100644 --- a/features/v2/undo.json +++ b/features/v2/undo.json @@ -3660,6 +3660,14 @@ "type": "idempotent" } }, + "DeleteLLMObsData": { + "tag": "LLM Observability", + "undo": { + "operationId": "TODO", + "parameters": [], + "type": "unsafe" + } + }, "ListLLMObsAnnotationQueues": { "tag": "LLM Observability", "undo": { @@ -3817,6 +3825,18 @@ "type": "idempotent" } }, + "ListLLMObsSpans": { + "tag": "LLM Observability", + "undo": { + "type": "safe" + } + }, + "SearchLLMObsSpans": { + "tag": "LLM Observability", + "undo": { + "type": "safe" + } + }, "ListLLMObsDatasets": { "tag": "LLM Observability", "undo": { diff --git a/lib/datadog_api_client/configuration.rb b/lib/datadog_api_client/configuration.rb index 63b14378c2a0..0cac7943cea0 100644 --- a/lib/datadog_api_client/configuration.rb +++ b/lib/datadog_api_client/configuration.rb @@ -218,6 +218,7 @@ def initialize "v2.delete_llm_obs_annotation_queue": false, "v2.delete_llm_obs_annotation_queue_interactions": false, "v2.delete_llm_obs_custom_eval_config": false, + "v2.delete_llm_obs_data": false, "v2.delete_llm_obs_dataset_records": false, "v2.delete_llm_obs_datasets": false, "v2.delete_llm_obs_experiments": false, @@ -231,7 +232,9 @@ def initialize "v2.list_llm_obs_experiment_events": false, "v2.list_llm_obs_experiments": false, "v2.list_llm_obs_projects": false, + "v2.list_llm_obs_spans": false, "v2.search_llm_obs_experimentation": false, + "v2.search_llm_obs_spans": false, "v2.simple_search_llm_obs_experimentation": false, "v2.update_llm_obs_annotation_queue": false, "v2.update_llm_obs_annotation_queue_label_schema": false, diff --git a/lib/datadog_api_client/inflector.rb b/lib/datadog_api_client/inflector.rb index c68c30af571a..a9b20652de22 100644 --- a/lib/datadog_api_client/inflector.rb +++ b/lib/datadog_api_client/inflector.rb @@ -3748,6 +3748,14 @@ def overrides "v2.llm_obs_custom_eval_config_update_request" => "LLMObsCustomEvalConfigUpdateRequest", "v2.llm_obs_custom_eval_config_user" => "LLMObsCustomEvalConfigUser", "v2.llm_obs_custom_eval_config_vertex_ai_options" => "LLMObsCustomEvalConfigVertexAIOptions", + "v2.llm_obs_data_deletion_request" => "LLMObsDataDeletionRequest", + "v2.llm_obs_data_deletion_request_attributes" => "LLMObsDataDeletionRequestAttributes", + "v2.llm_obs_data_deletion_request_data" => "LLMObsDataDeletionRequestData", + "v2.llm_obs_data_deletion_request_type" => "LLMObsDataDeletionRequestType", + "v2.llm_obs_data_deletion_response" => "LLMObsDataDeletionResponse", + "v2.llm_obs_data_deletion_response_attributes" => "LLMObsDataDeletionResponseAttributes", + "v2.llm_obs_data_deletion_response_data" => "LLMObsDataDeletionResponseData", + "v2.llm_obs_data_deletion_response_type" => "LLMObsDataDeletionResponseType", "v2.llm_obs_dataset_data_attributes_request" => "LLMObsDatasetDataAttributesRequest", "v2.llm_obs_dataset_data_attributes_response" => "LLMObsDatasetDataAttributesResponse", "v2.llm_obs_dataset_data_request" => "LLMObsDatasetDataRequest", @@ -3868,6 +3876,26 @@ def overrides "v2.llm_obs_project_update_data_request" => "LLMObsProjectUpdateDataRequest", "v2.llm_obs_project_update_request" => "LLMObsProjectUpdateRequest", "v2.llm_obs_record_type" => "LLMObsRecordType", + "v2.llm_obs_search_spans_request" => "LLMObsSearchSpansRequest", + "v2.llm_obs_search_spans_request_attributes" => "LLMObsSearchSpansRequestAttributes", + "v2.llm_obs_search_spans_request_data" => "LLMObsSearchSpansRequestData", + "v2.llm_obs_search_spans_request_type" => "LLMObsSearchSpansRequestType", + "v2.llm_obs_span_attributes" => "LLMObsSpanAttributes", + "v2.llm_obs_span_data" => "LLMObsSpanData", + "v2.llm_obs_span_evaluation_metric" => "LLMObsSpanEvaluationMetric", + "v2.llm_obs_span_filter" => "LLMObsSpanFilter", + "v2.llm_obs_span_io" => "LLMObsSpanIO", + "v2.llm_obs_span_message" => "LLMObsSpanMessage", + "v2.llm_obs_span_page_query" => "LLMObsSpanPageQuery", + "v2.llm_obs_span_search_options" => "LLMObsSpanSearchOptions", + "v2.llm_obs_spans_response" => "LLMObsSpansResponse", + "v2.llm_obs_spans_response_links" => "LLMObsSpansResponseLinks", + "v2.llm_obs_spans_response_meta" => "LLMObsSpansResponseMeta", + "v2.llm_obs_spans_response_page" => "LLMObsSpansResponsePage", + "v2.llm_obs_span_tool_call" => "LLMObsSpanToolCall", + "v2.llm_obs_span_tool_definition" => "LLMObsSpanToolDefinition", + "v2.llm_obs_span_tool_result" => "LLMObsSpanToolResult", + "v2.llm_obs_span_type" => "LLMObsSpanType", "v2.llm_obs_trace_annotated_interaction_item" => "LLMObsTraceAnnotatedInteractionItem", "v2.llm_obs_trace_interaction_item" => "LLMObsTraceInteractionItem", "v2.llm_obs_trace_interaction_response_item" => "LLMObsTraceInteractionResponseItem", diff --git a/lib/datadog_api_client/v2/api/llm_observability_api.rb b/lib/datadog_api_client/v2/api/llm_observability_api.rb index e3a6d14ebece..7eb5a93af50e 100644 --- a/lib/datadog_api_client/v2/api/llm_observability_api.rb +++ b/lib/datadog_api_client/v2/api/llm_observability_api.rb @@ -867,6 +867,79 @@ def delete_llm_obs_custom_eval_config_with_http_info(eval_name, opts = {}) return data, status_code, headers end + # Delete LLM Observability data. + # + # @see #delete_llm_obs_data_with_http_info + def delete_llm_obs_data(body, opts = {}) + data, _status_code, _headers = delete_llm_obs_data_with_http_info(body, opts) + data + end + + # Delete LLM Observability data. + # + # Submit a request to delete LLM Observability span data matching a trace ID filter within a specified time range. + # + # @param body [LLMObsDataDeletionRequest] Data deletion request payload. + # @param opts [Hash] the optional parameters + # @return [Array<(LLMObsDataDeletionResponse, Integer, Hash)>] LLMObsDataDeletionResponse data, response status code and response headers + def delete_llm_obs_data_with_http_info(body, opts = {}) + unstable_enabled = @api_client.config.unstable_operations["v2.delete_llm_obs_data".to_sym] + if unstable_enabled + @api_client.config.logger.warn format("Using unstable operation '%s'", "v2.delete_llm_obs_data") + else + raise DatadogAPIClient::APIError.new(message: format("Unstable operation '%s' is disabled", "v2.delete_llm_obs_data")) + end + + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: LLMObservabilityAPI.delete_llm_obs_data ...' + end + # verify the required parameter 'body' is set + if @api_client.config.client_side_validation && body.nil? + fail ArgumentError, "Missing the required parameter 'body' when calling LLMObservabilityAPI.delete_llm_obs_data" + end + # resource path + local_var_path = '/api/v2/llm-obs/deletion/data/llmobs' + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) + # HTTP header 'Content-Type' + header_params['Content-Type'] = @api_client.select_header_content_type(['application/json']) + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] || @api_client.object_to_http_body(body) + + # return_type + return_type = opts[:debug_return_type] || 'LLMObsDataDeletionResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || [:apiKeyAuth, :appKeyAuth] + + new_options = opts.merge( + :operation => :delete_llm_obs_data, + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type, + :api_version => "V2" + ) + + data, status_code, headers = @api_client.call_api(Net::HTTP::Post, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: LLMObservabilityAPI#delete_llm_obs_data\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + # Delete LLM Observability dataset records. # # @see #delete_llm_obs_dataset_records_with_http_info @@ -1845,6 +1918,96 @@ def list_llm_obs_projects_with_http_info(opts = {}) return data, status_code, headers end + # List LLM Observability spans. + # + # @see #list_llm_obs_spans_with_http_info + def list_llm_obs_spans(opts = {}) + data, _status_code, _headers = list_llm_obs_spans_with_http_info(opts) + data + end + + # List LLM Observability spans. + # + # List LLM Observability spans matching the specified filters. + # + # @param opts [Hash] the optional parameters + # @option opts [String] :filter_from Start of the time range. Accepts ISO 8601 or relative format (e.g., `now-15m`). Defaults to `now-15m`. + # @option opts [String] :filter_to End of the time range. Accepts ISO 8601 or relative format. Defaults to `now`. + # @option opts [String] :filter_query Search query using LLM Observability query syntax. Supports attribute filters using the field:value syntax (e.g. session_id, trace_id, ml_app, meta.span.kind). When provided, structured field filters (`filter[span_id]`, `filter[trace_id]`, etc.) are ignored. + # @option opts [String] :filter_span_id Filter by exact span ID. + # @option opts [String] :filter_trace_id Filter by exact trace ID. + # @option opts [String] :filter_span_kind Filter by span kind (e.g., llm, agent, tool, task, workflow). + # @option opts [String] :filter_span_name Filter by span name. + # @option opts [String] :filter_ml_app Filter by ML application name. + # @option opts [Integer] :page_limit Maximum number of spans to return. Defaults to `10`. + # @option opts [String] :page_cursor Cursor from the previous response to retrieve the next page. + # @option opts [String] :sort Sort order for the results. + # @option opts [Boolean] :include_attachments Whether to include attachment data in the response. Defaults to `true`. + # @return [Array<(LLMObsSpansResponse, Integer, Hash)>] LLMObsSpansResponse data, response status code and response headers + def list_llm_obs_spans_with_http_info(opts = {}) + unstable_enabled = @api_client.config.unstable_operations["v2.list_llm_obs_spans".to_sym] + if unstable_enabled + @api_client.config.logger.warn format("Using unstable operation '%s'", "v2.list_llm_obs_spans") + else + raise DatadogAPIClient::APIError.new(message: format("Unstable operation '%s' is disabled", "v2.list_llm_obs_spans")) + end + + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: LLMObservabilityAPI.list_llm_obs_spans ...' + end + # resource path + local_var_path = '/api/v2/llm-obs/v1/spans/events' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'filter[from]'] = opts[:'filter_from'] if !opts[:'filter_from'].nil? + query_params[:'filter[to]'] = opts[:'filter_to'] if !opts[:'filter_to'].nil? + query_params[:'filter[query]'] = opts[:'filter_query'] if !opts[:'filter_query'].nil? + query_params[:'filter[span_id]'] = opts[:'filter_span_id'] if !opts[:'filter_span_id'].nil? + query_params[:'filter[trace_id]'] = opts[:'filter_trace_id'] if !opts[:'filter_trace_id'].nil? + query_params[:'filter[span_kind]'] = opts[:'filter_span_kind'] if !opts[:'filter_span_kind'].nil? + query_params[:'filter[span_name]'] = opts[:'filter_span_name'] if !opts[:'filter_span_name'].nil? + query_params[:'filter[ml_app]'] = opts[:'filter_ml_app'] if !opts[:'filter_ml_app'].nil? + query_params[:'page[limit]'] = opts[:'page_limit'] if !opts[:'page_limit'].nil? + query_params[:'page[cursor]'] = opts[:'page_cursor'] if !opts[:'page_cursor'].nil? + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + query_params[:'include_attachments'] = opts[:'include_attachments'] if !opts[:'include_attachments'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'LLMObsSpansResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || [:apiKeyAuth, :appKeyAuth] + + new_options = opts.merge( + :operation => :list_llm_obs_spans, + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type, + :api_version => "V2" + ) + + data, status_code, headers = @api_client.call_api(Net::HTTP::Get, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: LLMObservabilityAPI#list_llm_obs_spans\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + # Search LLM Observability experimentation entities. # # @see #search_llm_obs_experimentation_with_http_info @@ -1922,6 +2085,79 @@ def search_llm_obs_experimentation_with_http_info(body, opts = {}) return data, status_code, headers end + # Search LLM Observability spans. + # + # @see #search_llm_obs_spans_with_http_info + def search_llm_obs_spans(body, opts = {}) + data, _status_code, _headers = search_llm_obs_spans_with_http_info(body, opts) + data + end + + # Search LLM Observability spans. + # + # Search LLM Observability spans using structured filters in the request body. + # + # @param body [LLMObsSearchSpansRequest] Search spans payload. + # @param opts [Hash] the optional parameters + # @return [Array<(LLMObsSpansResponse, Integer, Hash)>] LLMObsSpansResponse data, response status code and response headers + def search_llm_obs_spans_with_http_info(body, opts = {}) + unstable_enabled = @api_client.config.unstable_operations["v2.search_llm_obs_spans".to_sym] + if unstable_enabled + @api_client.config.logger.warn format("Using unstable operation '%s'", "v2.search_llm_obs_spans") + else + raise DatadogAPIClient::APIError.new(message: format("Unstable operation '%s' is disabled", "v2.search_llm_obs_spans")) + end + + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: LLMObservabilityAPI.search_llm_obs_spans ...' + end + # verify the required parameter 'body' is set + if @api_client.config.client_side_validation && body.nil? + fail ArgumentError, "Missing the required parameter 'body' when calling LLMObservabilityAPI.search_llm_obs_spans" + end + # resource path + local_var_path = '/api/v2/llm-obs/v1/spans/events/search' + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) + # HTTP header 'Content-Type' + header_params['Content-Type'] = @api_client.select_header_content_type(['application/json']) + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] || @api_client.object_to_http_body(body) + + # return_type + return_type = opts[:debug_return_type] || 'LLMObsSpansResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || [:apiKeyAuth, :appKeyAuth] + + new_options = opts.merge( + :operation => :search_llm_obs_spans, + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type, + :api_version => "V2" + ) + + data, status_code, headers = @api_client.call_api(Net::HTTP::Post, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: LLMObservabilityAPI#search_llm_obs_spans\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + # Simple search experimentation entities. # # @see #simple_search_llm_obs_experimentation_with_http_info diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request.rb new file mode 100644 index 000000000000..f9fee0ad157f --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request.rb @@ -0,0 +1,123 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Request to delete LLM Observability data. + class LLMObsDataDeletionRequest + include BaseGenericModel + + # Data object for an LLM Observability data deletion request. + attr_reader :data + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'data' => :'data' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'data' => :'LLMObsDataDeletionRequestData' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsDataDeletionRequest` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'data') + self.data = attributes[:'data'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @data.nil? + true + end + + # Custom attribute writer method with validation + # @param data [Object] Object to be assigned + # @!visibility private + def data=(data) + if data.nil? + fail ArgumentError, 'invalid value for "data", data cannot be nil.' + end + @data = data + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + data == o.data && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [data, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_attributes.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_attributes.rb new file mode 100644 index 000000000000..55b1eb96cb08 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_attributes.rb @@ -0,0 +1,175 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Attributes for an LLM Observability data deletion request. + class LLMObsDataDeletionRequestAttributes + include BaseGenericModel + + # Optional delay in seconds before the deletion is executed. + attr_accessor :delay + + # Start of the deletion time range in milliseconds since Unix epoch. + attr_reader :from + + # Query filters selecting the data to delete. Must include a `query` key with an `@trace_id` filter. + attr_reader :query + + # End of the deletion time range in milliseconds since Unix epoch. + attr_reader :to + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'delay' => :'delay', + :'from' => :'from', + :'query' => :'query', + :'to' => :'to' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'delay' => :'Integer', + :'from' => :'Integer', + :'query' => :'Hash', + :'to' => :'Integer' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsDataDeletionRequestAttributes` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'delay') + self.delay = attributes[:'delay'] + end + + if attributes.key?(:'from') + self.from = attributes[:'from'] + end + + if attributes.key?(:'query') + self.query = attributes[:'query'] + end + + if attributes.key?(:'to') + self.to = attributes[:'to'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @from.nil? + return false if @query.nil? + return false if @to.nil? + true + end + + # Custom attribute writer method with validation + # @param from [Object] Object to be assigned + # @!visibility private + def from=(from) + if from.nil? + fail ArgumentError, 'invalid value for "from", from cannot be nil.' + end + @from = from + end + + # Custom attribute writer method with validation + # @param query [Object] Object to be assigned + # @!visibility private + def query=(query) + if query.nil? + fail ArgumentError, 'invalid value for "query", query cannot be nil.' + end + @query = query + end + + # Custom attribute writer method with validation + # @param to [Object] Object to be assigned + # @!visibility private + def to=(to) + if to.nil? + fail ArgumentError, 'invalid value for "to", to cannot be nil.' + end + @to = to + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + delay == o.delay && + from == o.from && + query == o.query && + to == o.to && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [delay, from, query, to, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_data.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_data.rb new file mode 100644 index 000000000000..b781c05d60d7 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_data.rb @@ -0,0 +1,144 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Data object for an LLM Observability data deletion request. + class LLMObsDataDeletionRequestData + include BaseGenericModel + + # Attributes for an LLM Observability data deletion request. + attr_reader :attributes + + # Resource type for an LLM Observability data deletion request. + attr_reader :type + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'attributes' => :'attributes', + :'type' => :'type' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'attributes' => :'LLMObsDataDeletionRequestAttributes', + :'type' => :'LLMObsDataDeletionRequestType' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsDataDeletionRequestData` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'attributes') + self.attributes = attributes[:'attributes'] + end + + if attributes.key?(:'type') + self.type = attributes[:'type'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @attributes.nil? + return false if @type.nil? + true + end + + # Custom attribute writer method with validation + # @param attributes [Object] Object to be assigned + # @!visibility private + def attributes=(attributes) + if attributes.nil? + fail ArgumentError, 'invalid value for "attributes", attributes cannot be nil.' + end + @attributes = attributes + end + + # Custom attribute writer method with validation + # @param type [Object] Object to be assigned + # @!visibility private + def type=(type) + if type.nil? + fail ArgumentError, 'invalid value for "type", type cannot be nil.' + end + @type = type + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + attributes == o.attributes && + type == o.type && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [attributes, type, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_type.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_type.rb new file mode 100644 index 000000000000..c3ef1a38c138 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_request_type.rb @@ -0,0 +1,26 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Resource type for an LLM Observability data deletion request. + class LLMObsDataDeletionRequestType + include BaseEnumModel + + CREATE_DELETION_REQ = "create_deletion_req".freeze + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response.rb new file mode 100644 index 000000000000..102187ca4fd1 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response.rb @@ -0,0 +1,123 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Response containing details of a submitted LLM Observability data deletion request. + class LLMObsDataDeletionResponse + include BaseGenericModel + + # Data object for an LLM Observability data deletion response. + attr_reader :data + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'data' => :'data' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'data' => :'LLMObsDataDeletionResponseData' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsDataDeletionResponse` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'data') + self.data = attributes[:'data'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @data.nil? + true + end + + # Custom attribute writer method with validation + # @param data [Object] Object to be assigned + # @!visibility private + def data=(data) + if data.nil? + fail ArgumentError, 'invalid value for "data", data cannot be nil.' + end + @data = data + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + data == o.data && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [data, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_attributes.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_attributes.rb new file mode 100644 index 000000000000..234192d78116 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_attributes.rb @@ -0,0 +1,249 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Attributes of a submitted LLM Observability data deletion request. + class LLMObsDataDeletionResponseAttributes + include BaseGenericModel + + # Timestamp when the deletion request was created. + attr_reader :created_at + + # UUID of the user who created the deletion request. + attr_reader :created_by + + # Start of the deletion time range in milliseconds since Unix epoch. + attr_reader :from_time + + # ID of the organization that submitted the deletion request. + attr_reader :org_id + + # Product name for the deletion request. + attr_reader :product + + # The query string used to select data for deletion. + attr_reader :query + + # End of the deletion time range in milliseconds since Unix epoch. + attr_reader :to_time + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'created_at' => :'created_at', + :'created_by' => :'created_by', + :'from_time' => :'from_time', + :'org_id' => :'org_id', + :'product' => :'product', + :'query' => :'query', + :'to_time' => :'to_time' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'created_at' => :'Time', + :'created_by' => :'String', + :'from_time' => :'Integer', + :'org_id' => :'Integer', + :'product' => :'String', + :'query' => :'String', + :'to_time' => :'Integer' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsDataDeletionResponseAttributes` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'created_at') + self.created_at = attributes[:'created_at'] + end + + if attributes.key?(:'created_by') + self.created_by = attributes[:'created_by'] + end + + if attributes.key?(:'from_time') + self.from_time = attributes[:'from_time'] + end + + if attributes.key?(:'org_id') + self.org_id = attributes[:'org_id'] + end + + if attributes.key?(:'product') + self.product = attributes[:'product'] + end + + if attributes.key?(:'query') + self.query = attributes[:'query'] + end + + if attributes.key?(:'to_time') + self.to_time = attributes[:'to_time'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @created_at.nil? + return false if @created_by.nil? + return false if @from_time.nil? + return false if @org_id.nil? + return false if @product.nil? + return false if @query.nil? + return false if @to_time.nil? + true + end + + # Custom attribute writer method with validation + # @param created_at [Object] Object to be assigned + # @!visibility private + def created_at=(created_at) + if created_at.nil? + fail ArgumentError, 'invalid value for "created_at", created_at cannot be nil.' + end + @created_at = created_at + end + + # Custom attribute writer method with validation + # @param created_by [Object] Object to be assigned + # @!visibility private + def created_by=(created_by) + if created_by.nil? + fail ArgumentError, 'invalid value for "created_by", created_by cannot be nil.' + end + @created_by = created_by + end + + # Custom attribute writer method with validation + # @param from_time [Object] Object to be assigned + # @!visibility private + def from_time=(from_time) + if from_time.nil? + fail ArgumentError, 'invalid value for "from_time", from_time cannot be nil.' + end + @from_time = from_time + end + + # Custom attribute writer method with validation + # @param org_id [Object] Object to be assigned + # @!visibility private + def org_id=(org_id) + if org_id.nil? + fail ArgumentError, 'invalid value for "org_id", org_id cannot be nil.' + end + @org_id = org_id + end + + # Custom attribute writer method with validation + # @param product [Object] Object to be assigned + # @!visibility private + def product=(product) + if product.nil? + fail ArgumentError, 'invalid value for "product", product cannot be nil.' + end + @product = product + end + + # Custom attribute writer method with validation + # @param query [Object] Object to be assigned + # @!visibility private + def query=(query) + if query.nil? + fail ArgumentError, 'invalid value for "query", query cannot be nil.' + end + @query = query + end + + # Custom attribute writer method with validation + # @param to_time [Object] Object to be assigned + # @!visibility private + def to_time=(to_time) + if to_time.nil? + fail ArgumentError, 'invalid value for "to_time", to_time cannot be nil.' + end + @to_time = to_time + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + created_at == o.created_at && + created_by == o.created_by && + from_time == o.from_time && + org_id == o.org_id && + product == o.product && + query == o.query && + to_time == o.to_time && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [created_at, created_by, from_time, org_id, product, query, to_time, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_data.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_data.rb new file mode 100644 index 000000000000..4b35ec061395 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_data.rb @@ -0,0 +1,165 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Data object for an LLM Observability data deletion response. + class LLMObsDataDeletionResponseData + include BaseGenericModel + + # Attributes of a submitted LLM Observability data deletion request. + attr_reader :attributes + + # Unique identifier of the deletion request. + attr_reader :id + + # Resource type for an LLM Observability data deletion response. + attr_reader :type + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'attributes' => :'attributes', + :'id' => :'id', + :'type' => :'type' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'attributes' => :'LLMObsDataDeletionResponseAttributes', + :'id' => :'String', + :'type' => :'LLMObsDataDeletionResponseType' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsDataDeletionResponseData` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'attributes') + self.attributes = attributes[:'attributes'] + end + + if attributes.key?(:'id') + self.id = attributes[:'id'] + end + + if attributes.key?(:'type') + self.type = attributes[:'type'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @attributes.nil? + return false if @id.nil? + return false if @type.nil? + true + end + + # Custom attribute writer method with validation + # @param attributes [Object] Object to be assigned + # @!visibility private + def attributes=(attributes) + if attributes.nil? + fail ArgumentError, 'invalid value for "attributes", attributes cannot be nil.' + end + @attributes = attributes + end + + # Custom attribute writer method with validation + # @param id [Object] Object to be assigned + # @!visibility private + def id=(id) + if id.nil? + fail ArgumentError, 'invalid value for "id", id cannot be nil.' + end + @id = id + end + + # Custom attribute writer method with validation + # @param type [Object] Object to be assigned + # @!visibility private + def type=(type) + if type.nil? + fail ArgumentError, 'invalid value for "type", type cannot be nil.' + end + @type = type + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + attributes == o.attributes && + id == o.id && + type == o.type && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [attributes, id, type, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_type.rb b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_type.rb new file mode 100644 index 000000000000..93d4218715db --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_data_deletion_response_type.rb @@ -0,0 +1,26 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Resource type for an LLM Observability data deletion response. + class LLMObsDataDeletionResponseType + include BaseEnumModel + + DELETION_REQUEST = "deletion_request".freeze + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_search_spans_request.rb b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request.rb new file mode 100644 index 000000000000..283b09dfd80a --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request.rb @@ -0,0 +1,123 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Request body for searching LLM Observability spans. + class LLMObsSearchSpansRequest + include BaseGenericModel + + # Data object for an LLM Observability spans search request. + attr_reader :data + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'data' => :'data' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'data' => :'LLMObsSearchSpansRequestData' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSearchSpansRequest` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'data') + self.data = attributes[:'data'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @data.nil? + true + end + + # Custom attribute writer method with validation + # @param data [Object] Object to be assigned + # @!visibility private + def data=(data) + if data.nil? + fail ArgumentError, 'invalid value for "data", data cannot be nil.' + end + @data = data + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + data == o.data && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [data, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_attributes.rb b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_attributes.rb new file mode 100644 index 000000000000..54226a4403fc --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_attributes.rb @@ -0,0 +1,135 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Attributes of an LLM Observability spans search request. + class LLMObsSearchSpansRequestAttributes + include BaseGenericModel + + # Filter criteria for an LLM Observability span search. + attr_accessor :filter + + # Additional options for a span search request. + attr_accessor :options + + # Pagination settings for a span search request. + attr_accessor :page + + # Sort order for the results. Use `-` prefix for descending order. + attr_accessor :sort + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'filter' => :'filter', + :'options' => :'options', + :'page' => :'page', + :'sort' => :'sort' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'filter' => :'LLMObsSpanFilter', + :'options' => :'LLMObsSpanSearchOptions', + :'page' => :'LLMObsSpanPageQuery', + :'sort' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSearchSpansRequestAttributes` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'filter') + self.filter = attributes[:'filter'] + end + + if attributes.key?(:'options') + self.options = attributes[:'options'] + end + + if attributes.key?(:'page') + self.page = attributes[:'page'] + end + + if attributes.key?(:'sort') + self.sort = attributes[:'sort'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + filter == o.filter && + options == o.options && + page == o.page && + sort == o.sort && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [filter, options, page, sort, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_data.rb b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_data.rb new file mode 100644 index 000000000000..807364066f37 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_data.rb @@ -0,0 +1,144 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Data object for an LLM Observability spans search request. + class LLMObsSearchSpansRequestData + include BaseGenericModel + + # Attributes of an LLM Observability spans search request. + attr_reader :attributes + + # Resource type for an LLM Observability spans search request. + attr_reader :type + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'attributes' => :'attributes', + :'type' => :'type' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'attributes' => :'LLMObsSearchSpansRequestAttributes', + :'type' => :'LLMObsSearchSpansRequestType' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSearchSpansRequestData` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'attributes') + self.attributes = attributes[:'attributes'] + end + + if attributes.key?(:'type') + self.type = attributes[:'type'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @attributes.nil? + return false if @type.nil? + true + end + + # Custom attribute writer method with validation + # @param attributes [Object] Object to be assigned + # @!visibility private + def attributes=(attributes) + if attributes.nil? + fail ArgumentError, 'invalid value for "attributes", attributes cannot be nil.' + end + @attributes = attributes + end + + # Custom attribute writer method with validation + # @param type [Object] Object to be assigned + # @!visibility private + def type=(type) + if type.nil? + fail ArgumentError, 'invalid value for "type", type cannot be nil.' + end + @type = type + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + attributes == o.attributes && + type == o.type && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [attributes, type, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_type.rb b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_type.rb new file mode 100644 index 000000000000..123032909ba2 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_search_spans_request_type.rb @@ -0,0 +1,26 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Resource type for an LLM Observability spans search request. + class LLMObsSearchSpansRequestType + include BaseEnumModel + + SPANS = "spans".freeze + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_attributes.rb b/lib/datadog_api_client/v2/models/llm_obs_span_attributes.rb new file mode 100644 index 000000000000..46de8149c121 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_attributes.rb @@ -0,0 +1,384 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Attributes of an LLM Observability span. + class LLMObsSpanAttributes + include BaseGenericModel + + # Duration of the span in nanoseconds. + attr_reader :duration + + # Evaluation metrics keyed by evaluator name. + attr_accessor :evaluation + + # Input or output content of an LLM Observability span. + attr_accessor :input + + # Detected intent of the span. + attr_accessor :intent + + # Arbitrary metadata associated with the span. + attr_accessor :metadata + + # Numeric metrics associated with the span (e.g., token counts). + attr_accessor :metrics + + # Name of the ML application this span belongs to. + attr_reader :ml_app + + # Name of the model used in this span. + attr_accessor :model_name + + # Provider of the model used in this span. + attr_accessor :model_provider + + # Name of the span. + attr_reader :name + + # Input or output content of an LLM Observability span. + attr_accessor :output + + # Identifier of the parent span, if any. + attr_accessor :parent_id + + # Unique identifier of the span. + attr_reader :span_id + + # Kind of span (e.g., llm, agent, tool, task, workflow). + attr_reader :span_kind + + # Start time of the span in nanoseconds since Unix epoch. + attr_reader :start_ns + + # Status of the span (e.g., ok, error). + attr_reader :status + + # Tags associated with the span. + attr_accessor :tags + + # Tool definitions available to the span. + attr_accessor :tool_definitions + + # Trace identifier this span belongs to. + attr_reader :trace_id + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'duration' => :'duration', + :'evaluation' => :'evaluation', + :'input' => :'input', + :'intent' => :'intent', + :'metadata' => :'metadata', + :'metrics' => :'metrics', + :'ml_app' => :'ml_app', + :'model_name' => :'model_name', + :'model_provider' => :'model_provider', + :'name' => :'name', + :'output' => :'output', + :'parent_id' => :'parent_id', + :'span_id' => :'span_id', + :'span_kind' => :'span_kind', + :'start_ns' => :'start_ns', + :'status' => :'status', + :'tags' => :'tags', + :'tool_definitions' => :'tool_definitions', + :'trace_id' => :'trace_id' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'duration' => :'Float', + :'evaluation' => :'Hash', + :'input' => :'LLMObsSpanIO', + :'intent' => :'String', + :'metadata' => :'Hash', + :'metrics' => :'Hash', + :'ml_app' => :'String', + :'model_name' => :'String', + :'model_provider' => :'String', + :'name' => :'String', + :'output' => :'LLMObsSpanIO', + :'parent_id' => :'String', + :'span_id' => :'String', + :'span_kind' => :'String', + :'start_ns' => :'Integer', + :'status' => :'String', + :'tags' => :'Array', + :'tool_definitions' => :'Array', + :'trace_id' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanAttributes` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'duration') + self.duration = attributes[:'duration'] + end + + if attributes.key?(:'evaluation') + self.evaluation = attributes[:'evaluation'] + end + + if attributes.key?(:'input') + self.input = attributes[:'input'] + end + + if attributes.key?(:'intent') + self.intent = attributes[:'intent'] + end + + if attributes.key?(:'metadata') + self.metadata = attributes[:'metadata'] + end + + if attributes.key?(:'metrics') + self.metrics = attributes[:'metrics'] + end + + if attributes.key?(:'ml_app') + self.ml_app = attributes[:'ml_app'] + end + + if attributes.key?(:'model_name') + self.model_name = attributes[:'model_name'] + end + + if attributes.key?(:'model_provider') + self.model_provider = attributes[:'model_provider'] + end + + if attributes.key?(:'name') + self.name = attributes[:'name'] + end + + if attributes.key?(:'output') + self.output = attributes[:'output'] + end + + if attributes.key?(:'parent_id') + self.parent_id = attributes[:'parent_id'] + end + + if attributes.key?(:'span_id') + self.span_id = attributes[:'span_id'] + end + + if attributes.key?(:'span_kind') + self.span_kind = attributes[:'span_kind'] + end + + if attributes.key?(:'start_ns') + self.start_ns = attributes[:'start_ns'] + end + + if attributes.key?(:'status') + self.status = attributes[:'status'] + end + + if attributes.key?(:'tags') + if (value = attributes[:'tags']).is_a?(Array) + self.tags = value + end + end + + if attributes.key?(:'tool_definitions') + if (value = attributes[:'tool_definitions']).is_a?(Array) + self.tool_definitions = value + end + end + + if attributes.key?(:'trace_id') + self.trace_id = attributes[:'trace_id'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @duration.nil? + return false if @ml_app.nil? + return false if @name.nil? + return false if @span_id.nil? + return false if @span_kind.nil? + return false if @start_ns.nil? + return false if @status.nil? + return false if @trace_id.nil? + true + end + + # Custom attribute writer method with validation + # @param duration [Object] Object to be assigned + # @!visibility private + def duration=(duration) + if duration.nil? + fail ArgumentError, 'invalid value for "duration", duration cannot be nil.' + end + @duration = duration + end + + # Custom attribute writer method with validation + # @param ml_app [Object] Object to be assigned + # @!visibility private + def ml_app=(ml_app) + if ml_app.nil? + fail ArgumentError, 'invalid value for "ml_app", ml_app cannot be nil.' + end + @ml_app = ml_app + end + + # Custom attribute writer method with validation + # @param name [Object] Object to be assigned + # @!visibility private + def name=(name) + if name.nil? + fail ArgumentError, 'invalid value for "name", name cannot be nil.' + end + @name = name + end + + # Custom attribute writer method with validation + # @param span_id [Object] Object to be assigned + # @!visibility private + def span_id=(span_id) + if span_id.nil? + fail ArgumentError, 'invalid value for "span_id", span_id cannot be nil.' + end + @span_id = span_id + end + + # Custom attribute writer method with validation + # @param span_kind [Object] Object to be assigned + # @!visibility private + def span_kind=(span_kind) + if span_kind.nil? + fail ArgumentError, 'invalid value for "span_kind", span_kind cannot be nil.' + end + @span_kind = span_kind + end + + # Custom attribute writer method with validation + # @param start_ns [Object] Object to be assigned + # @!visibility private + def start_ns=(start_ns) + if start_ns.nil? + fail ArgumentError, 'invalid value for "start_ns", start_ns cannot be nil.' + end + @start_ns = start_ns + end + + # Custom attribute writer method with validation + # @param status [Object] Object to be assigned + # @!visibility private + def status=(status) + if status.nil? + fail ArgumentError, 'invalid value for "status", status cannot be nil.' + end + @status = status + end + + # Custom attribute writer method with validation + # @param trace_id [Object] Object to be assigned + # @!visibility private + def trace_id=(trace_id) + if trace_id.nil? + fail ArgumentError, 'invalid value for "trace_id", trace_id cannot be nil.' + end + @trace_id = trace_id + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + duration == o.duration && + evaluation == o.evaluation && + input == o.input && + intent == o.intent && + metadata == o.metadata && + metrics == o.metrics && + ml_app == o.ml_app && + model_name == o.model_name && + model_provider == o.model_provider && + name == o.name && + output == o.output && + parent_id == o.parent_id && + span_id == o.span_id && + span_kind == o.span_kind && + start_ns == o.start_ns && + status == o.status && + tags == o.tags && + tool_definitions == o.tool_definitions && + trace_id == o.trace_id && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [duration, evaluation, input, intent, metadata, metrics, ml_app, model_name, model_provider, name, output, parent_id, span_id, span_kind, start_ns, status, tags, tool_definitions, trace_id, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_data.rb b/lib/datadog_api_client/v2/models/llm_obs_span_data.rb new file mode 100644 index 000000000000..3aef607667f8 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_data.rb @@ -0,0 +1,165 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # A single LLM Observability span. + class LLMObsSpanData + include BaseGenericModel + + # Attributes of an LLM Observability span. + attr_reader :attributes + + # Unique identifier of the span. + attr_reader :id + + # Resource type for an LLM Observability span. + attr_reader :type + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'attributes' => :'attributes', + :'id' => :'id', + :'type' => :'type' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'attributes' => :'LLMObsSpanAttributes', + :'id' => :'String', + :'type' => :'LLMObsSpanType' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanData` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'attributes') + self.attributes = attributes[:'attributes'] + end + + if attributes.key?(:'id') + self.id = attributes[:'id'] + end + + if attributes.key?(:'type') + self.type = attributes[:'type'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @attributes.nil? + return false if @id.nil? + return false if @type.nil? + true + end + + # Custom attribute writer method with validation + # @param attributes [Object] Object to be assigned + # @!visibility private + def attributes=(attributes) + if attributes.nil? + fail ArgumentError, 'invalid value for "attributes", attributes cannot be nil.' + end + @attributes = attributes + end + + # Custom attribute writer method with validation + # @param id [Object] Object to be assigned + # @!visibility private + def id=(id) + if id.nil? + fail ArgumentError, 'invalid value for "id", id cannot be nil.' + end + @id = id + end + + # Custom attribute writer method with validation + # @param type [Object] Object to be assigned + # @!visibility private + def type=(type) + if type.nil? + fail ArgumentError, 'invalid value for "type", type cannot be nil.' + end + @type = type + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + attributes == o.attributes && + id == o.id && + type == o.type && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [attributes, id, type, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_evaluation_metric.rb b/lib/datadog_api_client/v2/models/llm_obs_span_evaluation_metric.rb new file mode 100644 index 000000000000..2ffbd3a058d0 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_evaluation_metric.rb @@ -0,0 +1,157 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # An evaluation metric associated with an LLM Observability span. + class LLMObsSpanEvaluationMetric + include BaseGenericModel + + # Assessment result (e.g., pass or fail). + attr_accessor :assessment + + # Type of the evaluation metric (e.g., score, categorical, boolean). + attr_accessor :eval_metric_type + + # Human-readable reasoning for the evaluation result. + attr_accessor :reasoning + + # Status of the evaluation execution. + attr_accessor :status + + # Tags associated with the evaluation metric. + attr_accessor :tags + + # Value of the evaluation result. + attr_accessor :value + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'assessment' => :'assessment', + :'eval_metric_type' => :'eval_metric_type', + :'reasoning' => :'reasoning', + :'status' => :'status', + :'tags' => :'tags', + :'value' => :'value' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'assessment' => :'String', + :'eval_metric_type' => :'String', + :'reasoning' => :'String', + :'status' => :'String', + :'tags' => :'Array', + :'value' => :'Object' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanEvaluationMetric` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'assessment') + self.assessment = attributes[:'assessment'] + end + + if attributes.key?(:'eval_metric_type') + self.eval_metric_type = attributes[:'eval_metric_type'] + end + + if attributes.key?(:'reasoning') + self.reasoning = attributes[:'reasoning'] + end + + if attributes.key?(:'status') + self.status = attributes[:'status'] + end + + if attributes.key?(:'tags') + if (value = attributes[:'tags']).is_a?(Array) + self.tags = value + end + end + + if attributes.key?(:'value') + self.value = attributes[:'value'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + assessment == o.assessment && + eval_metric_type == o.eval_metric_type && + reasoning == o.reasoning && + status == o.status && + tags == o.tags && + value == o.value && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [assessment, eval_metric_type, reasoning, status, tags, value, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_filter.rb b/lib/datadog_api_client/v2/models/llm_obs_span_filter.rb new file mode 100644 index 000000000000..38bc5f9a6c7c --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_filter.rb @@ -0,0 +1,185 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Filter criteria for an LLM Observability span search. + class LLMObsSpanFilter + include BaseGenericModel + + # Start of the time range. Accepts ISO 8601 or relative format (e.g., `now-15m`). Defaults to `now-15m`. + attr_accessor :from + + # Filter by ML application name. + attr_accessor :ml_app + + # Search query using LLM Observability query syntax. Supports attribute filters using the field:value syntax (e.g. session_id, trace_id, ml_app, meta.span.kind). When provided, structured field filters (`span_id`, `trace_id`, etc.) are ignored. + attr_accessor :query + + # Filter by exact span ID. + attr_accessor :span_id + + # Filter by span kind (e.g., llm, agent, tool, task, workflow). + attr_accessor :span_kind + + # Filter by span name. + attr_accessor :span_name + + # Filter by tag key-value pairs. + attr_accessor :tags + + # End of the time range. Accepts ISO 8601 or relative format (e.g., `now`). Defaults to `now`. + attr_accessor :to + + # Filter by exact trace ID. + attr_accessor :trace_id + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'from' => :'from', + :'ml_app' => :'ml_app', + :'query' => :'query', + :'span_id' => :'span_id', + :'span_kind' => :'span_kind', + :'span_name' => :'span_name', + :'tags' => :'tags', + :'to' => :'to', + :'trace_id' => :'trace_id' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'from' => :'String', + :'ml_app' => :'String', + :'query' => :'String', + :'span_id' => :'String', + :'span_kind' => :'String', + :'span_name' => :'String', + :'tags' => :'Hash', + :'to' => :'String', + :'trace_id' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanFilter` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'from') + self.from = attributes[:'from'] + end + + if attributes.key?(:'ml_app') + self.ml_app = attributes[:'ml_app'] + end + + if attributes.key?(:'query') + self.query = attributes[:'query'] + end + + if attributes.key?(:'span_id') + self.span_id = attributes[:'span_id'] + end + + if attributes.key?(:'span_kind') + self.span_kind = attributes[:'span_kind'] + end + + if attributes.key?(:'span_name') + self.span_name = attributes[:'span_name'] + end + + if attributes.key?(:'tags') + self.tags = attributes[:'tags'] + end + + if attributes.key?(:'to') + self.to = attributes[:'to'] + end + + if attributes.key?(:'trace_id') + self.trace_id = attributes[:'trace_id'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + from == o.from && + ml_app == o.ml_app && + query == o.query && + span_id == o.span_id && + span_kind == o.span_kind && + span_name == o.span_name && + tags == o.tags && + to == o.to && + trace_id == o.trace_id && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [from, ml_app, query, span_id, span_kind, span_name, tags, to, trace_id, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_io.rb b/lib/datadog_api_client/v2/models/llm_obs_span_io.rb new file mode 100644 index 000000000000..aa71504514fc --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_io.rb @@ -0,0 +1,117 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Input or output content of an LLM Observability span. + class LLMObsSpanIO + include BaseGenericModel + + # List of messages in the input or output. + attr_accessor :messages + + # Plain-text value of the input or output. + attr_accessor :value + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'messages' => :'messages', + :'value' => :'value' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'messages' => :'Array', + :'value' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanIO` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'messages') + if (value = attributes[:'messages']).is_a?(Array) + self.messages = value + end + end + + if attributes.key?(:'value') + self.value = attributes[:'value'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + messages == o.messages && + value == o.value && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [messages, value, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_message.rb b/lib/datadog_api_client/v2/models/llm_obs_span_message.rb new file mode 100644 index 000000000000..9b493d56d9b9 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_message.rb @@ -0,0 +1,149 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # A single message in a span input or output. + class LLMObsSpanMessage + include BaseGenericModel + + # Text content of the message. + attr_accessor :content + + # Unique identifier of the message. + attr_accessor :id + + # Role of the message sender (e.g., user, assistant, system). + attr_accessor :role + + # Tool calls made in this message. + attr_accessor :tool_calls + + # Tool results returned in this message. + attr_accessor :tool_results + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'content' => :'content', + :'id' => :'id', + :'role' => :'role', + :'tool_calls' => :'tool_calls', + :'tool_results' => :'tool_results' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'content' => :'String', + :'id' => :'String', + :'role' => :'String', + :'tool_calls' => :'Array', + :'tool_results' => :'Array' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanMessage` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'content') + self.content = attributes[:'content'] + end + + if attributes.key?(:'id') + self.id = attributes[:'id'] + end + + if attributes.key?(:'role') + self.role = attributes[:'role'] + end + + if attributes.key?(:'tool_calls') + if (value = attributes[:'tool_calls']).is_a?(Array) + self.tool_calls = value + end + end + + if attributes.key?(:'tool_results') + if (value = attributes[:'tool_results']).is_a?(Array) + self.tool_results = value + end + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + content == o.content && + id == o.id && + role == o.role && + tool_calls == o.tool_calls && + tool_results == o.tool_results && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [content, id, role, tool_calls, tool_results, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_page_query.rb b/lib/datadog_api_client/v2/models/llm_obs_span_page_query.rb new file mode 100644 index 000000000000..26a1fb6c1dcd --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_page_query.rb @@ -0,0 +1,115 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Pagination settings for a span search request. + class LLMObsSpanPageQuery + include BaseGenericModel + + # Cursor from the previous response to retrieve the next page. + attr_accessor :cursor + + # Maximum number of spans to return. Defaults to `10`. + attr_accessor :limit + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'cursor' => :'cursor', + :'limit' => :'limit' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'cursor' => :'String', + :'limit' => :'Integer' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanPageQuery` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'cursor') + self.cursor = attributes[:'cursor'] + end + + if attributes.key?(:'limit') + self.limit = attributes[:'limit'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + cursor == o.cursor && + limit == o.limit && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [cursor, limit, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_search_options.rb b/lib/datadog_api_client/v2/models/llm_obs_span_search_options.rb new file mode 100644 index 000000000000..f7f49faa2276 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_search_options.rb @@ -0,0 +1,115 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Additional options for a span search request. + class LLMObsSpanSearchOptions + include BaseGenericModel + + # Whether to include attachment data in the response. Defaults to `true`. + attr_accessor :include_attachments + + # Offset in seconds applied to both `from` and `to` timestamps. + attr_accessor :time_offset + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'include_attachments' => :'include_attachments', + :'time_offset' => :'time_offset' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'include_attachments' => :'Boolean', + :'time_offset' => :'Integer' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanSearchOptions` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'include_attachments') + self.include_attachments = attributes[:'include_attachments'] + end + + if attributes.key?(:'time_offset') + self.time_offset = attributes[:'time_offset'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + include_attachments == o.include_attachments && + time_offset == o.time_offset && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [include_attachments, time_offset, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_tool_call.rb b/lib/datadog_api_client/v2/models/llm_obs_span_tool_call.rb new file mode 100644 index 000000000000..2ede077fc748 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_tool_call.rb @@ -0,0 +1,135 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # A tool call made during a span. + class LLMObsSpanToolCall + include BaseGenericModel + + # Arguments passed to the tool. + attr_accessor :arguments + + # Name of the tool called. + attr_accessor :name + + # Identifier of the tool call. + attr_accessor :tool_id + + # Type of the tool call. + attr_accessor :type + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'arguments' => :'arguments', + :'name' => :'name', + :'tool_id' => :'tool_id', + :'type' => :'type' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'arguments' => :'Hash', + :'name' => :'String', + :'tool_id' => :'String', + :'type' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanToolCall` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'arguments') + self.arguments = attributes[:'arguments'] + end + + if attributes.key?(:'name') + self.name = attributes[:'name'] + end + + if attributes.key?(:'tool_id') + self.tool_id = attributes[:'tool_id'] + end + + if attributes.key?(:'type') + self.type = attributes[:'type'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + arguments == o.arguments && + name == o.name && + tool_id == o.tool_id && + type == o.type && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [arguments, name, tool_id, type, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_tool_definition.rb b/lib/datadog_api_client/v2/models/llm_obs_span_tool_definition.rb new file mode 100644 index 000000000000..ccf032a20c92 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_tool_definition.rb @@ -0,0 +1,135 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # A tool definition available to an LLM span. + class LLMObsSpanToolDefinition + include BaseGenericModel + + # Description of what the tool does. + attr_accessor :description + + # Name of the tool. + attr_accessor :name + + # JSON schema describing the tool's input parameters. + attr_accessor :schema + + # Version of the tool definition. + attr_accessor :version + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'description' => :'description', + :'name' => :'name', + :'schema' => :'schema', + :'version' => :'version' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'description' => :'String', + :'name' => :'String', + :'schema' => :'Hash', + :'version' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanToolDefinition` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'description') + self.description = attributes[:'description'] + end + + if attributes.key?(:'name') + self.name = attributes[:'name'] + end + + if attributes.key?(:'schema') + self.schema = attributes[:'schema'] + end + + if attributes.key?(:'version') + self.version = attributes[:'version'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + description == o.description && + name == o.name && + schema == o.schema && + version == o.version && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [description, name, schema, version, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_tool_result.rb b/lib/datadog_api_client/v2/models/llm_obs_span_tool_result.rb new file mode 100644 index 000000000000..f09946e315fc --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_tool_result.rb @@ -0,0 +1,135 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # A result returned from a tool call during a span. + class LLMObsSpanToolResult + include BaseGenericModel + + # Name of the tool that produced this result. + attr_accessor :name + + # Result value returned by the tool. + attr_accessor :result + + # Identifier of the corresponding tool call. + attr_accessor :tool_id + + # Type of the tool result. + attr_accessor :type + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'name' => :'name', + :'result' => :'result', + :'tool_id' => :'tool_id', + :'type' => :'type' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'name' => :'String', + :'result' => :'String', + :'tool_id' => :'String', + :'type' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpanToolResult` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'name') + self.name = attributes[:'name'] + end + + if attributes.key?(:'result') + self.result = attributes[:'result'] + end + + if attributes.key?(:'tool_id') + self.tool_id = attributes[:'tool_id'] + end + + if attributes.key?(:'type') + self.type = attributes[:'type'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + name == o.name && + result == o.result && + tool_id == o.tool_id && + type == o.type && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [name, result, tool_id, type, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_span_type.rb b/lib/datadog_api_client/v2/models/llm_obs_span_type.rb new file mode 100644 index 000000000000..f5a01cfad29b --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_span_type.rb @@ -0,0 +1,26 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Resource type for an LLM Observability span. + class LLMObsSpanType + include BaseEnumModel + + SPAN = "span".freeze + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_spans_response.rb b/lib/datadog_api_client/v2/models/llm_obs_spans_response.rb new file mode 100644 index 000000000000..40dd1d02ee5a --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_spans_response.rb @@ -0,0 +1,156 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Response containing a list of LLM Observability spans. + class LLMObsSpansResponse + include BaseGenericModel + + # List of spans matching the query. + attr_reader :data + + # Pagination links accompanying the spans response. + attr_accessor :links + + # Metadata accompanying the spans response. + attr_reader :meta + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'data' => :'data', + :'links' => :'links', + :'meta' => :'meta' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'data' => :'Array', + :'links' => :'LLMObsSpansResponseLinks', + :'meta' => :'LLMObsSpansResponseMeta' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpansResponse` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'data') + if (value = attributes[:'data']).is_a?(Array) + self.data = value + end + end + + if attributes.key?(:'links') + self.links = attributes[:'links'] + end + + if attributes.key?(:'meta') + self.meta = attributes[:'meta'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @data.nil? + return false if @meta.nil? + true + end + + # Custom attribute writer method with validation + # @param data [Object] Object to be assigned + # @!visibility private + def data=(data) + if data.nil? + fail ArgumentError, 'invalid value for "data", data cannot be nil.' + end + @data = data + end + + # Custom attribute writer method with validation + # @param meta [Object] Object to be assigned + # @!visibility private + def meta=(meta) + if meta.nil? + fail ArgumentError, 'invalid value for "meta", meta cannot be nil.' + end + @meta = meta + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + data == o.data && + links == o.links && + meta == o.meta && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [data, links, meta, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_spans_response_links.rb b/lib/datadog_api_client/v2/models/llm_obs_spans_response_links.rb new file mode 100644 index 000000000000..0302bdb34da0 --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_spans_response_links.rb @@ -0,0 +1,105 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Pagination links accompanying the spans response. + class LLMObsSpansResponseLinks + include BaseGenericModel + + # URL to retrieve the next page of results. + attr_accessor :_next + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'_next' => :'next' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'_next' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpansResponseLinks` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'_next') + self._next = attributes[:'_next'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + _next == o._next && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [_next, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_spans_response_meta.rb b/lib/datadog_api_client/v2/models/llm_obs_spans_response_meta.rb new file mode 100644 index 000000000000..6d958a44868f --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_spans_response_meta.rb @@ -0,0 +1,186 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Metadata accompanying the spans response. + class LLMObsSpansResponseMeta + include BaseGenericModel + + # Time elapsed for the query in milliseconds. + attr_reader :elapsed + + # Pagination cursor for the spans response. + attr_reader :page + + # Unique identifier for the request. + attr_reader :request_id + + # Status of the query execution. + attr_reader :status + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'elapsed' => :'elapsed', + :'page' => :'page', + :'request_id' => :'request_id', + :'status' => :'status' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'elapsed' => :'Integer', + :'page' => :'LLMObsSpansResponsePage', + :'request_id' => :'String', + :'status' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpansResponseMeta` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'elapsed') + self.elapsed = attributes[:'elapsed'] + end + + if attributes.key?(:'page') + self.page = attributes[:'page'] + end + + if attributes.key?(:'request_id') + self.request_id = attributes[:'request_id'] + end + + if attributes.key?(:'status') + self.status = attributes[:'status'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @elapsed.nil? + return false if @page.nil? + return false if @request_id.nil? + return false if @status.nil? + true + end + + # Custom attribute writer method with validation + # @param elapsed [Object] Object to be assigned + # @!visibility private + def elapsed=(elapsed) + if elapsed.nil? + fail ArgumentError, 'invalid value for "elapsed", elapsed cannot be nil.' + end + @elapsed = elapsed + end + + # Custom attribute writer method with validation + # @param page [Object] Object to be assigned + # @!visibility private + def page=(page) + if page.nil? + fail ArgumentError, 'invalid value for "page", page cannot be nil.' + end + @page = page + end + + # Custom attribute writer method with validation + # @param request_id [Object] Object to be assigned + # @!visibility private + def request_id=(request_id) + if request_id.nil? + fail ArgumentError, 'invalid value for "request_id", request_id cannot be nil.' + end + @request_id = request_id + end + + # Custom attribute writer method with validation + # @param status [Object] Object to be assigned + # @!visibility private + def status=(status) + if status.nil? + fail ArgumentError, 'invalid value for "status", status cannot be nil.' + end + @status = status + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + elapsed == o.elapsed && + page == o.page && + request_id == o.request_id && + status == o.status && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [elapsed, page, request_id, status, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/llm_obs_spans_response_page.rb b/lib/datadog_api_client/v2/models/llm_obs_spans_response_page.rb new file mode 100644 index 000000000000..3bd6d5c5388d --- /dev/null +++ b/lib/datadog_api_client/v2/models/llm_obs_spans_response_page.rb @@ -0,0 +1,105 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Pagination cursor for the spans response. + class LLMObsSpansResponsePage + include BaseGenericModel + + # Cursor to retrieve the next page of results. Absent when there are no more results. + attr_accessor :after + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'after' => :'after' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'after' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::LLMObsSpansResponsePage` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'after') + self.after = attributes[:'after'] + end + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + after == o.after && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [after, additional_properties].hash + end + end +end From 2d21fcbaddb7fb9faf03faec68823db82a73a5fd Mon Sep 17 00:00:00 2001 From: "api-clients-generation-pipeline[bot]" <54105614+api-clients-generation-pipeline[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 17:49:26 +0000 Subject: [PATCH 2/4] Record cassettes for app-builder lifecycle endpoints (#3349) Co-authored-by: ci.datadog-api-spec --- ...-Request-returns-Not-Found-response.frozen | 1 + ...ish-Request-returns-Not-Found-response.yml | 27 +++++ ...Versions-returns-Not-Found-response.frozen | 1 + ...pp-Versions-returns-Not-Found-response.yml | 22 ++++ ...st-App-Versions-returns-OK-response.frozen | 1 + .../List-App-Versions-returns-OK-response.yml | 77 +++++++++++++ ...Version-returns-No-Content-response.frozen | 1 + ...pp-Version-returns-No-Content-response.yml | 74 ++++++++++++ ...-Version-returns-Not-Found-response.frozen | 1 + ...App-Version-returns-Not-Found-response.yml | 26 +++++ ...vert-App-returns-Not-Found-response.frozen | 1 + .../Revert-App-returns-Not-Found-response.yml | 22 ++++ ...-Status-returns-No-Content-response.frozen | 1 + ...ite-Status-returns-No-Content-response.yml | 74 ++++++++++++ ...e-Status-returns-Not-Found-response.frozen | 1 + ...rite-Status-returns-Not-Found-response.yml | 26 +++++ ...on-Level-returns-Not-Found-response.frozen | 1 + ...ction-Level-returns-Not-Found-response.yml | 26 +++++ ...rotection-Level-returns-OK-response.frozen | 1 + ...p-Protection-Level-returns-OK-response.yml | 88 +++++++++++++++ ...-Status-returns-No-Content-response.frozen | 1 + ...ice-Status-returns-No-Content-response.yml | 74 ++++++++++++ ...e-Status-returns-Not-Found-response.frozen | 1 + ...vice-Status-returns-Not-Found-response.yml | 26 +++++ ...pp-Tags-returns-No-Content-response.frozen | 1 + ...e-App-Tags-returns-No-Content-response.yml | 74 ++++++++++++ ...App-Tags-returns-Not-Found-response.frozen | 1 + ...te-App-Tags-returns-Not-Found-response.yml | 26 +++++ examples/v2/app-builder/ListAppVersions.rb | 5 +- examples/v2/app-builder/UpdateAppFavorite.rb | 5 +- .../v2/app-builder/UpdateAppSelfService.rb | 5 +- examples/v2/app-builder/UpdateAppTags.rb | 5 +- .../v2/app-builder/UpdateAppVersionName.rb | 5 +- .../v2/app-builder/UpdateProtectionLevel.rb | 5 +- features/v2/app_builder.feature | 105 ++++++++++-------- 35 files changed, 756 insertions(+), 55 deletions(-) create mode 100644 cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.yml create mode 100644 cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.yml create mode 100644 cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.frozen create mode 100644 cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.yml create mode 100644 cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.frozen create mode 100644 cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.yml create mode 100644 cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.yml create mode 100644 cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.yml create mode 100644 cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.frozen create mode 100644 cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.yml diff --git a/cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..3630c84dd5b7 --- /dev/null +++ b/cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:51:47.462Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.yml new file mode 100644 index 000000000000..240fe165272c --- /dev/null +++ b/cassettes/features/v2/app_builder/Create-Publish-Request-returns-Not-Found-response.yml @@ -0,0 +1,27 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:51:47 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"description":"Adds new dashboard widgets and + a few bug fixes.","title":"Release v1.2 to production"},"type":"publishRequest"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/publish-request + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"c9247d40-2291-4860-90ac-9c2441ff23db","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..25a432b084d5 --- /dev/null +++ b/cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:51:53.216Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.yml new file mode 100644 index 000000000000..32c2c7610892 --- /dev/null +++ b/cassettes/features/v2/app_builder/List-App-Versions-returns-Not-Found-response.yml @@ -0,0 +1,22 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:51:53 GMT + request: + body: null + headers: + Accept: + - application/json + method: GET + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/versions + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"4dfd53b4-6987-4868-b330-af0535219c61","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.frozen b/cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.frozen new file mode 100644 index 000000000000..f134f1904137 --- /dev/null +++ b/cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:51:53.386Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.yml b/cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.yml new file mode 100644 index 000000000000..792873730354 --- /dev/null +++ b/cassettes/features/v2/app_builder/List-App-Versions-returns-OK-response.yml @@ -0,0 +1,77 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:51:53 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"components":[{"events":[],"name":"grid0","properties":{"backgroundColor":"default","children":[{"events":[],"name":"gridCell0","properties":{"children":[{"events":[],"name":"text0","properties":{"content":"# + Cat Facts","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":5,"width":4,"x":0,"y":0}}},"type":"gridCell"},{"events":[],"name":"gridCell2","properties":{"children":[{"events":[],"name":"table0","properties":{"columns":[{"dataPath":"fact","header":"fact","id":"0ae2ae9e-0280-4389-83c6-1c5949f7e674","isHidden":false},{"dataPath":"length","header":"length","id":"c9048611-0196-4a00-9366-1ef9e3ec0408","isHidden":true},{"dataPath":"Due + Date","disableSortBy":false,"formatter":{"format":"LARGE_WITHOUT_TIME","type":"formatted_time"},"header":"Unused + Old Column","id":"8fa9284b-7a58-4f13-9959-57b7d8a7fe8f","isDeleted":true}],"data":"${fetchFacts?.outputs?.body?.data}","globalFilter":false,"isLoading":"${fetchFacts?.isLoading}","isScrollable":"vertical","isSubRowsEnabled":false,"isVisible":true,"isWrappable":false,"pageSize":"${pageSize?.value}","paginationType":"server_side","rowButtons":[],"summary":true,"totalCount":"${fetchFacts?.outputs?.body?.total}"},"type":"table"}],"isVisible":"true","layout":{"default":{"height":96,"width":12,"x":0,"y":5}}},"type":"gridCell"},{"events":[],"name":"gridCell1","properties":{"children":[{"events":[],"name":"text1","properties":{"content":"## + Random Fact\n\n${randomFact?.outputs?.fact}","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":16,"width":12,"x":0,"y":101}}},"type":"gridCell"},{"events":[],"name":"gridCell3","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + + 1}","variableName":"pageSize"}],"name":"button0","properties":{"iconLeft":"angleUp","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Increase + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":134}}},"type":"gridCell"},{"events":[],"name":"gridCell4","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + - 1}","variableName":"pageSize"}],"name":"button1","properties":{"iconLeft":"angleDown","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Decrease + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":138}}},"type":"gridCell"}]},"type":"grid"}],"description":"This + is a slightly complicated example app that fetches and displays cat facts","name":"Example + Cat Facts Viewer","queries":[{"events":[],"id":"92ff0bb8-553b-4f31-87c7-ef5bd16d47d5","name":"fetchFacts","properties":{"spec":{"connectionId":"5e63f4a8-4ce6-47de-ba11-f6617c1d54f3","fqn":"com.datadoghq.http.request","inputs":{"url":"https://catfact.ninja/facts","urlParams":[{"key":"limit","value":"${pageSize.value.toString()}"},{"key":"page","value":"${(table0.pageIndex + + 1).toString()}"}],"verb":"GET"}}},"type":"action"},{"id":"afd03c81-4075-4432-8618-ba09d52d2f2d","name":"pageSize","properties":{"defaultValue":"${20}"},"type":"stateVariable"},{"id":"0fb22859-47dc-4137-9e41-7b67d04c525c","name":"randomFact","properties":{"outputs":"${(() + => {const facts = fetchFacts.outputs.body.data\nreturn facts[Math.floor(Math.random()*facts.length)]\n})()}"},"type":"dataTransform"}],"rootInstanceName":"grid0"},"type":"appDefinitions"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"d928ecbc-acfe-4126-96f6-092fa0a01416","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 201 + message: Created +- recorded_at: Mon, 18 May 2026 19:51:53 GMT + request: + body: null + headers: + Accept: + - application/json + method: GET + uri: https://api.datadoghq.com/api/v2/app-builder/apps/d928ecbc-acfe-4126-96f6-092fa0a01416/versions + response: + body: + encoding: UTF-8 + string: '{"data": [{"id": "98cd3a5a-644d-41fd-8ffa-e58e21e8e21b", "type": "appVersions", + "attributes": {"app_id": "d928ecbc-acfe-4126-96f6-092fa0a01416", "created_at": + "2026-05-18T19:51:53.59976Z", "has_ever_been_published": false, "updated_at": + "2026-05-18T19:51:53.59976Z", "user_id": 1445416, "user_name": "", "user_uuid": + "3ad549bf-eba0-11e9-a77a-0705486660d0", "version": 1}}], "meta": {"page": + {"totalCount": 1, "totalFilteredCount": 0}}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +- recorded_at: Mon, 18 May 2026 19:51:53 GMT + request: + body: null + headers: + Accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v2/app-builder/apps/d928ecbc-acfe-4126-96f6-092fa0a01416 + response: + body: + encoding: UTF-8 + string: '{"data": {"id": "d928ecbc-acfe-4126-96f6-092fa0a01416", "type": "appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.frozen b/cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.frozen new file mode 100644 index 000000000000..b224652513eb --- /dev/null +++ b/cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:51:55.262Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.yml b/cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.yml new file mode 100644 index 000000000000..bf42aaee876b --- /dev/null +++ b/cassettes/features/v2/app_builder/Name-App-Version-returns-No-Content-response.yml @@ -0,0 +1,74 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:51:55 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"components":[{"events":[],"name":"grid0","properties":{"backgroundColor":"default","children":[{"events":[],"name":"gridCell0","properties":{"children":[{"events":[],"name":"text0","properties":{"content":"# + Cat Facts","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":5,"width":4,"x":0,"y":0}}},"type":"gridCell"},{"events":[],"name":"gridCell2","properties":{"children":[{"events":[],"name":"table0","properties":{"columns":[{"dataPath":"fact","header":"fact","id":"0ae2ae9e-0280-4389-83c6-1c5949f7e674","isHidden":false},{"dataPath":"length","header":"length","id":"c9048611-0196-4a00-9366-1ef9e3ec0408","isHidden":true},{"dataPath":"Due + Date","disableSortBy":false,"formatter":{"format":"LARGE_WITHOUT_TIME","type":"formatted_time"},"header":"Unused + Old Column","id":"8fa9284b-7a58-4f13-9959-57b7d8a7fe8f","isDeleted":true}],"data":"${fetchFacts?.outputs?.body?.data}","globalFilter":false,"isLoading":"${fetchFacts?.isLoading}","isScrollable":"vertical","isSubRowsEnabled":false,"isVisible":true,"isWrappable":false,"pageSize":"${pageSize?.value}","paginationType":"server_side","rowButtons":[],"summary":true,"totalCount":"${fetchFacts?.outputs?.body?.total}"},"type":"table"}],"isVisible":"true","layout":{"default":{"height":96,"width":12,"x":0,"y":5}}},"type":"gridCell"},{"events":[],"name":"gridCell1","properties":{"children":[{"events":[],"name":"text1","properties":{"content":"## + Random Fact\n\n${randomFact?.outputs?.fact}","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":16,"width":12,"x":0,"y":101}}},"type":"gridCell"},{"events":[],"name":"gridCell3","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + + 1}","variableName":"pageSize"}],"name":"button0","properties":{"iconLeft":"angleUp","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Increase + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":134}}},"type":"gridCell"},{"events":[],"name":"gridCell4","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + - 1}","variableName":"pageSize"}],"name":"button1","properties":{"iconLeft":"angleDown","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Decrease + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":138}}},"type":"gridCell"}]},"type":"grid"}],"description":"This + is a slightly complicated example app that fetches and displays cat facts","name":"Example + Cat Facts Viewer","queries":[{"events":[],"id":"92ff0bb8-553b-4f31-87c7-ef5bd16d47d5","name":"fetchFacts","properties":{"spec":{"connectionId":"5e63f4a8-4ce6-47de-ba11-f6617c1d54f3","fqn":"com.datadoghq.http.request","inputs":{"url":"https://catfact.ninja/facts","urlParams":[{"key":"limit","value":"${pageSize.value.toString()}"},{"key":"page","value":"${(table0.pageIndex + + 1).toString()}"}],"verb":"GET"}}},"type":"action"},{"id":"afd03c81-4075-4432-8618-ba09d52d2f2d","name":"pageSize","properties":{"defaultValue":"${20}"},"type":"stateVariable"},{"id":"0fb22859-47dc-4137-9e41-7b67d04c525c","name":"randomFact","properties":{"outputs":"${(() + => {const facts = fetchFacts.outputs.body.data\nreturn facts[Math.floor(Math.random()*facts.length)]\n})()}"},"type":"dataTransform"}],"rootInstanceName":"grid0"},"type":"appDefinitions"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"850d5920-6bfb-4723-a3ff-91bfb2d898d8","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 201 + message: Created +- recorded_at: Mon, 18 May 2026 19:51:55 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"name":"v1.2.0 - bug fix release"},"type":"versionNames"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/850d5920-6bfb-4723-a3ff-91bfb2d898d8/version-name?version=latest + response: + body: + encoding: UTF-8 + string: '' + headers: {} + status: + code: 204 + message: No Content +- recorded_at: Mon, 18 May 2026 19:51:55 GMT + request: + body: null + headers: + Accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v2/app-builder/apps/850d5920-6bfb-4723-a3ff-91bfb2d898d8 + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"850d5920-6bfb-4723-a3ff-91bfb2d898d8","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..f304ca2f6842 --- /dev/null +++ b/cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:51:56.300Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.yml new file mode 100644 index 000000000000..20eac26a0075 --- /dev/null +++ b/cassettes/features/v2/app_builder/Name-App-Version-returns-Not-Found-response.yml @@ -0,0 +1,26 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:51:56 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"name":"v1.2.0 - bug fix release"},"type":"versionNames"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/version-name?version=latest + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"16fc993f-2445-4b88-b1e7-c924feed5141","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..b8cdcb67d8cf --- /dev/null +++ b/cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:51:58.197Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.yml new file mode 100644 index 000000000000..ebc82995093d --- /dev/null +++ b/cassettes/features/v2/app_builder/Revert-App-returns-Not-Found-response.yml @@ -0,0 +1,22 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:51:58 GMT + request: + body: null + headers: + Accept: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/revert?version=1 + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"09483925-ee8b-44c8-882a-35b53e209584","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.frozen b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.frozen new file mode 100644 index 000000000000..632a7af485a6 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:51:59.539Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.yml b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.yml new file mode 100644 index 000000000000..1a3b300a8d08 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-No-Content-response.yml @@ -0,0 +1,74 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:51:59 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"components":[{"events":[],"name":"grid0","properties":{"backgroundColor":"default","children":[{"events":[],"name":"gridCell0","properties":{"children":[{"events":[],"name":"text0","properties":{"content":"# + Cat Facts","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":5,"width":4,"x":0,"y":0}}},"type":"gridCell"},{"events":[],"name":"gridCell2","properties":{"children":[{"events":[],"name":"table0","properties":{"columns":[{"dataPath":"fact","header":"fact","id":"0ae2ae9e-0280-4389-83c6-1c5949f7e674","isHidden":false},{"dataPath":"length","header":"length","id":"c9048611-0196-4a00-9366-1ef9e3ec0408","isHidden":true},{"dataPath":"Due + Date","disableSortBy":false,"formatter":{"format":"LARGE_WITHOUT_TIME","type":"formatted_time"},"header":"Unused + Old Column","id":"8fa9284b-7a58-4f13-9959-57b7d8a7fe8f","isDeleted":true}],"data":"${fetchFacts?.outputs?.body?.data}","globalFilter":false,"isLoading":"${fetchFacts?.isLoading}","isScrollable":"vertical","isSubRowsEnabled":false,"isVisible":true,"isWrappable":false,"pageSize":"${pageSize?.value}","paginationType":"server_side","rowButtons":[],"summary":true,"totalCount":"${fetchFacts?.outputs?.body?.total}"},"type":"table"}],"isVisible":"true","layout":{"default":{"height":96,"width":12,"x":0,"y":5}}},"type":"gridCell"},{"events":[],"name":"gridCell1","properties":{"children":[{"events":[],"name":"text1","properties":{"content":"## + Random Fact\n\n${randomFact?.outputs?.fact}","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":16,"width":12,"x":0,"y":101}}},"type":"gridCell"},{"events":[],"name":"gridCell3","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + + 1}","variableName":"pageSize"}],"name":"button0","properties":{"iconLeft":"angleUp","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Increase + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":134}}},"type":"gridCell"},{"events":[],"name":"gridCell4","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + - 1}","variableName":"pageSize"}],"name":"button1","properties":{"iconLeft":"angleDown","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Decrease + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":138}}},"type":"gridCell"}]},"type":"grid"}],"description":"This + is a slightly complicated example app that fetches and displays cat facts","name":"Example + Cat Facts Viewer","queries":[{"events":[],"id":"92ff0bb8-553b-4f31-87c7-ef5bd16d47d5","name":"fetchFacts","properties":{"spec":{"connectionId":"5e63f4a8-4ce6-47de-ba11-f6617c1d54f3","fqn":"com.datadoghq.http.request","inputs":{"url":"https://catfact.ninja/facts","urlParams":[{"key":"limit","value":"${pageSize.value.toString()}"},{"key":"page","value":"${(table0.pageIndex + + 1).toString()}"}],"verb":"GET"}}},"type":"action"},{"id":"afd03c81-4075-4432-8618-ba09d52d2f2d","name":"pageSize","properties":{"defaultValue":"${20}"},"type":"stateVariable"},{"id":"0fb22859-47dc-4137-9e41-7b67d04c525c","name":"randomFact","properties":{"outputs":"${(() + => {const facts = fetchFacts.outputs.body.data\nreturn facts[Math.floor(Math.random()*facts.length)]\n})()}"},"type":"dataTransform"}],"rootInstanceName":"grid0"},"type":"appDefinitions"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"ff20368e-cb9a-4216-aa76-a61c11aef6d1","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 201 + message: Created +- recorded_at: Mon, 18 May 2026 19:51:59 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"favorite":true},"type":"favorites"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/ff20368e-cb9a-4216-aa76-a61c11aef6d1/favorite + response: + body: + encoding: UTF-8 + string: '' + headers: {} + status: + code: 204 + message: No Content +- recorded_at: Mon, 18 May 2026 19:51:59 GMT + request: + body: null + headers: + Accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v2/app-builder/apps/ff20368e-cb9a-4216-aa76-a61c11aef6d1 + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"ff20368e-cb9a-4216-aa76-a61c11aef6d1","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..ff1ec95de16c --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:52:01.652Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.yml new file mode 100644 index 000000000000..94a4899b5170 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Favorite-Status-returns-Not-Found-response.yml @@ -0,0 +1,26 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:52:01 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"favorite":true},"type":"favorites"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/favorite + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"3711d641-f1a9-4a08-b8a2-f02b0c6d3cac","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..be4a0d65e2d7 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:52:01.865Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.yml new file mode 100644 index 000000000000..4955c5bf47fe --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-Not-Found-response.yml @@ -0,0 +1,26 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:52:01 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"protectionLevel":"approval_required"},"type":"protectionLevel"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/protection-level + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"ac8e4f99-d059-43c6-b48a-2feb634c46b9","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.frozen b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.frozen new file mode 100644 index 000000000000..181d84d9c6e4 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:52:02.394Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.yml b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.yml new file mode 100644 index 000000000000..9d23875c6abd --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Protection-Level-returns-OK-response.yml @@ -0,0 +1,88 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:52:02 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"components":[{"events":[],"name":"grid0","properties":{"backgroundColor":"default","children":[{"events":[],"name":"gridCell0","properties":{"children":[{"events":[],"name":"text0","properties":{"content":"# + Cat Facts","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":5,"width":4,"x":0,"y":0}}},"type":"gridCell"},{"events":[],"name":"gridCell2","properties":{"children":[{"events":[],"name":"table0","properties":{"columns":[{"dataPath":"fact","header":"fact","id":"0ae2ae9e-0280-4389-83c6-1c5949f7e674","isHidden":false},{"dataPath":"length","header":"length","id":"c9048611-0196-4a00-9366-1ef9e3ec0408","isHidden":true},{"dataPath":"Due + Date","disableSortBy":false,"formatter":{"format":"LARGE_WITHOUT_TIME","type":"formatted_time"},"header":"Unused + Old Column","id":"8fa9284b-7a58-4f13-9959-57b7d8a7fe8f","isDeleted":true}],"data":"${fetchFacts?.outputs?.body?.data}","globalFilter":false,"isLoading":"${fetchFacts?.isLoading}","isScrollable":"vertical","isSubRowsEnabled":false,"isVisible":true,"isWrappable":false,"pageSize":"${pageSize?.value}","paginationType":"server_side","rowButtons":[],"summary":true,"totalCount":"${fetchFacts?.outputs?.body?.total}"},"type":"table"}],"isVisible":"true","layout":{"default":{"height":96,"width":12,"x":0,"y":5}}},"type":"gridCell"},{"events":[],"name":"gridCell1","properties":{"children":[{"events":[],"name":"text1","properties":{"content":"## + Random Fact\n\n${randomFact?.outputs?.fact}","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":16,"width":12,"x":0,"y":101}}},"type":"gridCell"},{"events":[],"name":"gridCell3","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + + 1}","variableName":"pageSize"}],"name":"button0","properties":{"iconLeft":"angleUp","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Increase + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":134}}},"type":"gridCell"},{"events":[],"name":"gridCell4","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + - 1}","variableName":"pageSize"}],"name":"button1","properties":{"iconLeft":"angleDown","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Decrease + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":138}}},"type":"gridCell"}]},"type":"grid"}],"description":"This + is a slightly complicated example app that fetches and displays cat facts","name":"Example + Cat Facts Viewer","queries":[{"events":[],"id":"92ff0bb8-553b-4f31-87c7-ef5bd16d47d5","name":"fetchFacts","properties":{"spec":{"connectionId":"5e63f4a8-4ce6-47de-ba11-f6617c1d54f3","fqn":"com.datadoghq.http.request","inputs":{"url":"https://catfact.ninja/facts","urlParams":[{"key":"limit","value":"${pageSize.value.toString()}"},{"key":"page","value":"${(table0.pageIndex + + 1).toString()}"}],"verb":"GET"}}},"type":"action"},{"id":"afd03c81-4075-4432-8618-ba09d52d2f2d","name":"pageSize","properties":{"defaultValue":"${20}"},"type":"stateVariable"},{"id":"0fb22859-47dc-4137-9e41-7b67d04c525c","name":"randomFact","properties":{"outputs":"${(() + => {const facts = fetchFacts.outputs.body.data\nreturn facts[Math.floor(Math.random()*facts.length)]\n})()}"},"type":"dataTransform"}],"rootInstanceName":"grid0"},"type":"appDefinitions"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"7233c313-f027-46ba-b269-fbca3f75cbad","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 201 + message: Created +- recorded_at: Mon, 18 May 2026 19:52:02 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"protectionLevel":"approval_required"},"type":"protectionLevel"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7233c313-f027-46ba-b269-fbca3f75cbad/protection-level + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"7233c313-f027-46ba-b269-fbca3f75cbad","type":"appDefinitions","attributes":{"components":[{"events":[],"name":"grid0","properties":{"backgroundColor":"default","children":[{"events":[],"name":"gridCell0","properties":{"children":[{"events":[],"name":"text0","properties":{"content":"# + Cat Facts","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":5,"width":4,"x":0,"y":0}}},"type":"gridCell"},{"events":[],"name":"gridCell2","properties":{"children":[{"events":[],"name":"table0","properties":{"columns":[{"dataPath":"fact","header":"fact","id":"0ae2ae9e-0280-4389-83c6-1c5949f7e674","isHidden":false},{"dataPath":"length","header":"length","id":"c9048611-0196-4a00-9366-1ef9e3ec0408","isHidden":true},{"dataPath":"Due + Date","disableSortBy":false,"formatter":{"format":"LARGE_WITHOUT_TIME","type":"formatted_time"},"header":"Unused + Old Column","id":"8fa9284b-7a58-4f13-9959-57b7d8a7fe8f","isDeleted":true}],"data":"${fetchFacts?.outputs?.body?.data}","globalFilter":false,"isLoading":"${fetchFacts?.isLoading}","isScrollable":"vertical","isSubRowsEnabled":false,"isVisible":true,"isWrappable":false,"pageSize":"${pageSize?.value}","paginationType":"server_side","rowButtons":[],"summary":true,"totalCount":"${fetchFacts?.outputs?.body?.total}"},"type":"table"}],"isVisible":"true","layout":{"default":{"height":96,"width":12,"x":0,"y":5}}},"type":"gridCell"},{"events":[],"name":"gridCell1","properties":{"children":[{"events":[],"name":"text1","properties":{"content":"## + Random Fact\n\n${randomFact?.outputs?.fact}","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":16,"width":12,"x":0,"y":101}}},"type":"gridCell"},{"events":[],"name":"gridCell3","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + + 1}","variableName":"pageSize"}],"name":"button0","properties":{"iconLeft":"angleUp","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Increase + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":134}}},"type":"gridCell"},{"events":[],"name":"gridCell4","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + - 1}","variableName":"pageSize"}],"name":"button1","properties":{"iconLeft":"angleDown","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Decrease + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":138}}},"type":"gridCell"}]},"type":"grid"}],"description":"This + is a slightly complicated example app that fetches and displays cat facts","favorite":false,"name":"Example + Cat Facts Viewer","protectionLevel":"approval_required","queries":[{"id":"92ff0bb8-553b-4f31-87c7-ef5bd16d47d5","name":"fetchFacts","type":"action","properties":{"spec":{"connectionId":"5e63f4a8-4ce6-47de-ba11-f6617c1d54f3","fqn":"com.datadoghq.http.request","inputs":{"url":"https://catfact.ninja/facts","urlParams":[{"key":"limit","value":"${pageSize.value.toString()}"},{"key":"page","value":"${(table0.pageIndex + + 1).toString()}"}],"verb":"GET"}}}},{"id":"afd03c81-4075-4432-8618-ba09d52d2f2d","name":"pageSize","type":"stateVariable","properties":{"defaultValue":"${20}"}},{"id":"0fb22859-47dc-4137-9e41-7b67d04c525c","name":"randomFact","type":"dataTransform","properties":{"outputs":"${(() + =\u003e {const facts = fetchFacts.outputs.body.data\nreturn facts[Math.floor(Math.random()*facts.length)]\n})()}"}}],"rootInstanceName":"grid0","selfService":false,"tags":[]},"meta":{"org_id":321813,"user_id":1445416,"user_uuid":"3ad549bf-eba0-11e9-a77a-0705486660d0","user_name":"frog@datadoghq.com","version":1,"version_id":"42a9e44d-6fd7-4dd6-8a72-17e570b9e46f","updated_since_deployment":false,"created_at":"2026-05-18T19:52:02.806411Z","updated_at":"2026-05-18T19:52:02.806411Z","deleted_at":"0001-01-01T00:00:00Z","run_as_user":"3ad549bf-eba0-11e9-a77a-0705486660d0"}}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +- recorded_at: Mon, 18 May 2026 19:52:02 GMT + request: + body: null + headers: + Accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7233c313-f027-46ba-b269-fbca3f75cbad + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"7233c313-f027-46ba-b269-fbca3f75cbad","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.frozen b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.frozen new file mode 100644 index 000000000000..30060a318bf8 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:52:04.154Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.yml b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.yml new file mode 100644 index 000000000000..ccc618b54935 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-No-Content-response.yml @@ -0,0 +1,74 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:52:04 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"components":[{"events":[],"name":"grid0","properties":{"backgroundColor":"default","children":[{"events":[],"name":"gridCell0","properties":{"children":[{"events":[],"name":"text0","properties":{"content":"# + Cat Facts","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":5,"width":4,"x":0,"y":0}}},"type":"gridCell"},{"events":[],"name":"gridCell2","properties":{"children":[{"events":[],"name":"table0","properties":{"columns":[{"dataPath":"fact","header":"fact","id":"0ae2ae9e-0280-4389-83c6-1c5949f7e674","isHidden":false},{"dataPath":"length","header":"length","id":"c9048611-0196-4a00-9366-1ef9e3ec0408","isHidden":true},{"dataPath":"Due + Date","disableSortBy":false,"formatter":{"format":"LARGE_WITHOUT_TIME","type":"formatted_time"},"header":"Unused + Old Column","id":"8fa9284b-7a58-4f13-9959-57b7d8a7fe8f","isDeleted":true}],"data":"${fetchFacts?.outputs?.body?.data}","globalFilter":false,"isLoading":"${fetchFacts?.isLoading}","isScrollable":"vertical","isSubRowsEnabled":false,"isVisible":true,"isWrappable":false,"pageSize":"${pageSize?.value}","paginationType":"server_side","rowButtons":[],"summary":true,"totalCount":"${fetchFacts?.outputs?.body?.total}"},"type":"table"}],"isVisible":"true","layout":{"default":{"height":96,"width":12,"x":0,"y":5}}},"type":"gridCell"},{"events":[],"name":"gridCell1","properties":{"children":[{"events":[],"name":"text1","properties":{"content":"## + Random Fact\n\n${randomFact?.outputs?.fact}","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":16,"width":12,"x":0,"y":101}}},"type":"gridCell"},{"events":[],"name":"gridCell3","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + + 1}","variableName":"pageSize"}],"name":"button0","properties":{"iconLeft":"angleUp","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Increase + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":134}}},"type":"gridCell"},{"events":[],"name":"gridCell4","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + - 1}","variableName":"pageSize"}],"name":"button1","properties":{"iconLeft":"angleDown","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Decrease + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":138}}},"type":"gridCell"}]},"type":"grid"}],"description":"This + is a slightly complicated example app that fetches and displays cat facts","name":"Example + Cat Facts Viewer","queries":[{"events":[],"id":"92ff0bb8-553b-4f31-87c7-ef5bd16d47d5","name":"fetchFacts","properties":{"spec":{"connectionId":"5e63f4a8-4ce6-47de-ba11-f6617c1d54f3","fqn":"com.datadoghq.http.request","inputs":{"url":"https://catfact.ninja/facts","urlParams":[{"key":"limit","value":"${pageSize.value.toString()}"},{"key":"page","value":"${(table0.pageIndex + + 1).toString()}"}],"verb":"GET"}}},"type":"action"},{"id":"afd03c81-4075-4432-8618-ba09d52d2f2d","name":"pageSize","properties":{"defaultValue":"${20}"},"type":"stateVariable"},{"id":"0fb22859-47dc-4137-9e41-7b67d04c525c","name":"randomFact","properties":{"outputs":"${(() + => {const facts = fetchFacts.outputs.body.data\nreturn facts[Math.floor(Math.random()*facts.length)]\n})()}"},"type":"dataTransform"}],"rootInstanceName":"grid0"},"type":"appDefinitions"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"f18f2a0e-bf9a-4b7a-b43d-31ca68aaf5f1","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 201 + message: Created +- recorded_at: Mon, 18 May 2026 19:52:04 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"selfService":true},"type":"selfService"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/f18f2a0e-bf9a-4b7a-b43d-31ca68aaf5f1/self-service + response: + body: + encoding: UTF-8 + string: '' + headers: {} + status: + code: 204 + message: No Content +- recorded_at: Mon, 18 May 2026 19:52:04 GMT + request: + body: null + headers: + Accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v2/app-builder/apps/f18f2a0e-bf9a-4b7a-b43d-31ca68aaf5f1 + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"f18f2a0e-bf9a-4b7a-b43d-31ca68aaf5f1","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..e8d61c771533 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:52:06.076Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.yml new file mode 100644 index 000000000000..870baf61b09e --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Self-Service-Status-returns-Not-Found-response.yml @@ -0,0 +1,26 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:52:06 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"selfService":true},"type":"selfService"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/self-service + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"623c417b-ba6a-4952-8d3c-1d90edaf3166","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.frozen b/cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.frozen new file mode 100644 index 000000000000..94bb561b71f4 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:52:06.248Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.yml b/cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.yml new file mode 100644 index 000000000000..282489a8b62c --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Tags-returns-No-Content-response.yml @@ -0,0 +1,74 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:52:06 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"components":[{"events":[],"name":"grid0","properties":{"backgroundColor":"default","children":[{"events":[],"name":"gridCell0","properties":{"children":[{"events":[],"name":"text0","properties":{"content":"# + Cat Facts","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":5,"width":4,"x":0,"y":0}}},"type":"gridCell"},{"events":[],"name":"gridCell2","properties":{"children":[{"events":[],"name":"table0","properties":{"columns":[{"dataPath":"fact","header":"fact","id":"0ae2ae9e-0280-4389-83c6-1c5949f7e674","isHidden":false},{"dataPath":"length","header":"length","id":"c9048611-0196-4a00-9366-1ef9e3ec0408","isHidden":true},{"dataPath":"Due + Date","disableSortBy":false,"formatter":{"format":"LARGE_WITHOUT_TIME","type":"formatted_time"},"header":"Unused + Old Column","id":"8fa9284b-7a58-4f13-9959-57b7d8a7fe8f","isDeleted":true}],"data":"${fetchFacts?.outputs?.body?.data}","globalFilter":false,"isLoading":"${fetchFacts?.isLoading}","isScrollable":"vertical","isSubRowsEnabled":false,"isVisible":true,"isWrappable":false,"pageSize":"${pageSize?.value}","paginationType":"server_side","rowButtons":[],"summary":true,"totalCount":"${fetchFacts?.outputs?.body?.total}"},"type":"table"}],"isVisible":"true","layout":{"default":{"height":96,"width":12,"x":0,"y":5}}},"type":"gridCell"},{"events":[],"name":"gridCell1","properties":{"children":[{"events":[],"name":"text1","properties":{"content":"## + Random Fact\n\n${randomFact?.outputs?.fact}","contentType":"markdown","isVisible":true,"textAlign":"left","verticalAlign":"top"},"type":"text"}],"isVisible":"true","layout":{"default":{"height":16,"width":12,"x":0,"y":101}}},"type":"gridCell"},{"events":[],"name":"gridCell3","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + + 1}","variableName":"pageSize"}],"name":"button0","properties":{"iconLeft":"angleUp","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Increase + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":134}}},"type":"gridCell"},{"events":[],"name":"gridCell4","properties":{"children":[{"events":[{"name":"click","type":"setStateVariableValue","value":"${pageSize?.value + - 1}","variableName":"pageSize"}],"name":"button1","properties":{"iconLeft":"angleDown","iconRight":"","isBorderless":false,"isDisabled":false,"isLoading":false,"isPrimary":true,"isVisible":true,"label":"Decrease + Page Size","level":"default"},"type":"button"}],"isVisible":"true","layout":{"default":{"height":4,"width":2,"x":10,"y":138}}},"type":"gridCell"}]},"type":"grid"}],"description":"This + is a slightly complicated example app that fetches and displays cat facts","name":"Example + Cat Facts Viewer","queries":[{"events":[],"id":"92ff0bb8-553b-4f31-87c7-ef5bd16d47d5","name":"fetchFacts","properties":{"spec":{"connectionId":"5e63f4a8-4ce6-47de-ba11-f6617c1d54f3","fqn":"com.datadoghq.http.request","inputs":{"url":"https://catfact.ninja/facts","urlParams":[{"key":"limit","value":"${pageSize.value.toString()}"},{"key":"page","value":"${(table0.pageIndex + + 1).toString()}"}],"verb":"GET"}}},"type":"action"},{"id":"afd03c81-4075-4432-8618-ba09d52d2f2d","name":"pageSize","properties":{"defaultValue":"${20}"},"type":"stateVariable"},{"id":"0fb22859-47dc-4137-9e41-7b67d04c525c","name":"randomFact","properties":{"outputs":"${(() + => {const facts = fetchFacts.outputs.body.data\nreturn facts[Math.floor(Math.random()*facts.length)]\n})()}"},"type":"dataTransform"}],"rootInstanceName":"grid0"},"type":"appDefinitions"}}' + headers: + Accept: + - application/json + Content-Type: + - application/json + method: POST + uri: https://api.datadoghq.com/api/v2/app-builder/apps + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"57a1c1c9-edfb-47ea-ad74-e90c2e13d0f0","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 201 + message: Created +- recorded_at: Mon, 18 May 2026 19:52:06 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"tags":["team:platform","service:ops"]},"type":"tags"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/57a1c1c9-edfb-47ea-ad74-e90c2e13d0f0/tags + response: + body: + encoding: UTF-8 + string: '' + headers: {} + status: + code: 204 + message: No Content +- recorded_at: Mon, 18 May 2026 19:52:06 GMT + request: + body: null + headers: + Accept: + - application/json + method: DELETE + uri: https://api.datadoghq.com/api/v2/app-builder/apps/57a1c1c9-edfb-47ea-ad74-e90c2e13d0f0 + response: + body: + encoding: UTF-8 + string: '{"data":{"id":"57a1c1c9-edfb-47ea-ad74-e90c2e13d0f0","type":"appDefinitions"}}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 200 + message: OK +recorded_with: VCR 6.0.0 diff --git a/cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.frozen b/cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.frozen new file mode 100644 index 000000000000..641ef7d09b70 --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.frozen @@ -0,0 +1 @@ +2026-05-18T19:52:07.233Z \ No newline at end of file diff --git a/cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.yml b/cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.yml new file mode 100644 index 000000000000..9ac87ac5e13b --- /dev/null +++ b/cassettes/features/v2/app_builder/Update-App-Tags-returns-Not-Found-response.yml @@ -0,0 +1,26 @@ +http_interactions: +- recorded_at: Mon, 18 May 2026 19:52:07 GMT + request: + body: + encoding: UTF-8 + string: '{"data":{"attributes":{"tags":["team:platform","service:ops"]},"type":"tags"}}' + headers: + Accept: + - '*/*' + Content-Type: + - application/json + method: PATCH + uri: https://api.datadoghq.com/api/v2/app-builder/apps/7addb29b-f935-472c-ae79-d1963979a23e/tags + response: + body: + encoding: UTF-8 + string: '{"errors":[{"status":"404","id":"26c91c86-51b3-4c5f-98b4-713698730b08","title":"app + not found","detail":"app with id 7addb29b-f935-472c-ae79-d1963979a23e not + found"}]}' + headers: + Content-Type: + - application/vnd.api+json + status: + code: 404 + message: Not Found +recorded_with: VCR 6.0.0 diff --git a/examples/v2/app-builder/ListAppVersions.rb b/examples/v2/app-builder/ListAppVersions.rb index 1c53dd590e11..d9f40bba0edd 100644 --- a/examples/v2/app-builder/ListAppVersions.rb +++ b/examples/v2/app-builder/ListAppVersions.rb @@ -2,4 +2,7 @@ require "datadog_api_client" api_instance = DatadogAPIClient::V2::AppBuilderAPI.new -p api_instance.list_app_versions("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d") + +# there is a valid "app" in the system +APP_DATA_ID = ENV["APP_DATA_ID"] +p api_instance.list_app_versions(APP_DATA_ID) diff --git a/examples/v2/app-builder/UpdateAppFavorite.rb b/examples/v2/app-builder/UpdateAppFavorite.rb index 13d3ed6442fc..aa4b6c67c87d 100644 --- a/examples/v2/app-builder/UpdateAppFavorite.rb +++ b/examples/v2/app-builder/UpdateAppFavorite.rb @@ -3,6 +3,9 @@ require "datadog_api_client" api_instance = DatadogAPIClient::V2::AppBuilderAPI.new +# there is a valid "app" in the system +APP_DATA_ID = ENV["APP_DATA_ID"] + body = DatadogAPIClient::V2::UpdateAppFavoriteRequest.new({ data: DatadogAPIClient::V2::UpdateAppFavoriteRequestData.new({ attributes: DatadogAPIClient::V2::UpdateAppFavoriteRequestDataAttributes.new({ @@ -11,4 +14,4 @@ type: DatadogAPIClient::V2::AppFavoriteType::FAVORITES, }), }) -api_instance.update_app_favorite("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", body) +api_instance.update_app_favorite(APP_DATA_ID, body) diff --git a/examples/v2/app-builder/UpdateAppSelfService.rb b/examples/v2/app-builder/UpdateAppSelfService.rb index ea0308cb9039..df41753a7d7a 100644 --- a/examples/v2/app-builder/UpdateAppSelfService.rb +++ b/examples/v2/app-builder/UpdateAppSelfService.rb @@ -3,6 +3,9 @@ require "datadog_api_client" api_instance = DatadogAPIClient::V2::AppBuilderAPI.new +# there is a valid "app" in the system +APP_DATA_ID = ENV["APP_DATA_ID"] + body = DatadogAPIClient::V2::UpdateAppSelfServiceRequest.new({ data: DatadogAPIClient::V2::UpdateAppSelfServiceRequestData.new({ attributes: DatadogAPIClient::V2::UpdateAppSelfServiceRequestDataAttributes.new({ @@ -11,4 +14,4 @@ type: DatadogAPIClient::V2::AppSelfServiceType::SELFSERVICE, }), }) -api_instance.update_app_self_service("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", body) +api_instance.update_app_self_service(APP_DATA_ID, body) diff --git a/examples/v2/app-builder/UpdateAppTags.rb b/examples/v2/app-builder/UpdateAppTags.rb index 04d8ec88dbab..a1ac5574196b 100644 --- a/examples/v2/app-builder/UpdateAppTags.rb +++ b/examples/v2/app-builder/UpdateAppTags.rb @@ -3,6 +3,9 @@ require "datadog_api_client" api_instance = DatadogAPIClient::V2::AppBuilderAPI.new +# there is a valid "app" in the system +APP_DATA_ID = ENV["APP_DATA_ID"] + body = DatadogAPIClient::V2::UpdateAppTagsRequest.new({ data: DatadogAPIClient::V2::UpdateAppTagsRequestData.new({ attributes: DatadogAPIClient::V2::UpdateAppTagsRequestDataAttributes.new({ @@ -14,4 +17,4 @@ type: DatadogAPIClient::V2::AppTagsType::TAGS, }), }) -api_instance.update_app_tags("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", body) +api_instance.update_app_tags(APP_DATA_ID, body) diff --git a/examples/v2/app-builder/UpdateAppVersionName.rb b/examples/v2/app-builder/UpdateAppVersionName.rb index b321d09ad329..c977e0da5db8 100644 --- a/examples/v2/app-builder/UpdateAppVersionName.rb +++ b/examples/v2/app-builder/UpdateAppVersionName.rb @@ -3,6 +3,9 @@ require "datadog_api_client" api_instance = DatadogAPIClient::V2::AppBuilderAPI.new +# there is a valid "app" in the system +APP_DATA_ID = ENV["APP_DATA_ID"] + body = DatadogAPIClient::V2::UpdateAppVersionNameRequest.new({ data: DatadogAPIClient::V2::UpdateAppVersionNameRequestData.new({ attributes: DatadogAPIClient::V2::UpdateAppVersionNameRequestDataAttributes.new({ @@ -11,4 +14,4 @@ type: DatadogAPIClient::V2::AppVersionNameType::VERSIONNAMES, }), }) -api_instance.update_app_version_name("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", "version", body) +api_instance.update_app_version_name(APP_DATA_ID, "latest", body) diff --git a/examples/v2/app-builder/UpdateProtectionLevel.rb b/examples/v2/app-builder/UpdateProtectionLevel.rb index 877c217e4443..e18968dec65b 100644 --- a/examples/v2/app-builder/UpdateProtectionLevel.rb +++ b/examples/v2/app-builder/UpdateProtectionLevel.rb @@ -3,6 +3,9 @@ require "datadog_api_client" api_instance = DatadogAPIClient::V2::AppBuilderAPI.new +# there is a valid "app" in the system +APP_DATA_ID = ENV["APP_DATA_ID"] + body = DatadogAPIClient::V2::UpdateAppProtectionLevelRequest.new({ data: DatadogAPIClient::V2::UpdateAppProtectionLevelRequestData.new({ attributes: DatadogAPIClient::V2::UpdateAppProtectionLevelRequestDataAttributes.new({ @@ -11,4 +14,4 @@ type: DatadogAPIClient::V2::AppProtectionLevelType::PROTECTIONLEVEL, }), }) -p api_instance.update_protection_level("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d", body) +p api_instance.update_protection_level(APP_DATA_ID, body) diff --git a/features/v2/app_builder.feature b/features/v2/app_builder.feature index bbc0caf196fd..9f2b3174bc2c 100644 --- a/features/v2/app_builder.feature +++ b/features/v2/app_builder.feature @@ -27,10 +27,10 @@ Feature: App Builder Then the response status is 201 Created And the response "data.type" is equal to "appDefinitions" - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Create Publish Request returns "Bad Request" response Given new "CreatePublishRequest" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" And body with value {"data": {"attributes": {"description": "Adds new dashboard widgets and a few bug fixes.", "title": "Release v1.2 to production"}, "type": "publishRequest"}} When the request is sent Then the response status is 400 Bad Request @@ -43,10 +43,10 @@ Feature: App Builder When the request is sent Then the response status is 201 Created - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Create Publish Request returns "Not Found" response Given new "CreatePublishRequest" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" And body with value {"data": {"attributes": {"description": "Adds new dashboard widgets and a few bug fixes.", "title": "Release v1.2 to production"}, "type": "publishRequest"}} When the request is sent Then the response status is 404 Not Found @@ -139,24 +139,25 @@ Feature: App Builder And the response "data.id" has the same value as "app.data.id" And the response "data.type" is equal to "appDefinitions" - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: List App Versions returns "Bad Request" response Given new "ListAppVersions" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" When the request is sent Then the response status is 400 Bad Request - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: List App Versions returns "Not Found" response Given new "ListAppVersions" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" When the request is sent Then the response status is 404 Not Found - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: List App Versions returns "OK" response Given new "ListAppVersions" request - And request contains "app_id" parameter from "REPLACE.ME" + And there is a valid "app" in the system + And request contains "app_id" parameter from "app.data.id" When the request is sent Then the response status is 200 OK @@ -172,29 +173,30 @@ Feature: App Builder When the request is sent Then the response status is 200 OK - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Name App Version returns "Bad Request" response Given new "UpdateAppVersionName" request - And request contains "app_id" parameter from "REPLACE.ME" - And request contains "version" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" + And request contains "version" parameter with value "latest" And body with value {"data": {"attributes": {"name": "v1.2.0 - bug fix release"}, "type": "versionNames"}} When the request is sent Then the response status is 400 Bad Request - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Name App Version returns "No Content" response Given new "UpdateAppVersionName" request - And request contains "app_id" parameter from "REPLACE.ME" - And request contains "version" parameter from "REPLACE.ME" + And there is a valid "app" in the system + And request contains "app_id" parameter from "app.data.id" + And request contains "version" parameter with value "latest" And body with value {"data": {"attributes": {"name": "v1.2.0 - bug fix release"}, "type": "versionNames"}} When the request is sent Then the response status is 204 No Content - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Name App Version returns "Not Found" response Given new "UpdateAppVersionName" request - And request contains "app_id" parameter from "REPLACE.ME" - And request contains "version" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" + And request contains "version" parameter with value "latest" And body with value {"data": {"attributes": {"name": "v1.2.0 - bug fix release"}, "type": "versionNames"}} When the request is sent Then the response status is 404 Not Found @@ -221,19 +223,19 @@ Feature: App Builder When the request is sent Then the response status is 404 Not Found - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Revert App returns "Bad Request" response Given new "RevertApp" request - And request contains "app_id" parameter from "REPLACE.ME" - And request contains "version" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" + And request contains "version" parameter with value "1" When the request is sent Then the response status is 400 Bad Request - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Revert App returns "Not Found" response Given new "RevertApp" request - And request contains "app_id" parameter from "REPLACE.ME" - And request contains "version" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" + And request contains "version" parameter with value "1" When the request is sent Then the response status is 404 Not Found @@ -267,98 +269,103 @@ Feature: App Builder When the request is sent Then the response status is 200 OK - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Update App Favorite Status returns "Bad Request" response Given new "UpdateAppFavorite" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" And body with value {"data": {"attributes": {"favorite": true}, "type": "favorites"}} When the request is sent Then the response status is 400 Bad Request - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Favorite Status returns "No Content" response Given new "UpdateAppFavorite" request - And request contains "app_id" parameter from "REPLACE.ME" + And there is a valid "app" in the system + And request contains "app_id" parameter from "app.data.id" And body with value {"data": {"attributes": {"favorite": true}, "type": "favorites"}} When the request is sent Then the response status is 204 No Content - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Favorite Status returns "Not Found" response Given new "UpdateAppFavorite" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" And body with value {"data": {"attributes": {"favorite": true}, "type": "favorites"}} When the request is sent Then the response status is 404 Not Found - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Update App Protection Level returns "Bad Request" response Given new "UpdateProtectionLevel" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" And body with value {"data": {"attributes": {"protectionLevel": "approval_required"}, "type": "protectionLevel"}} When the request is sent Then the response status is 400 Bad Request - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Protection Level returns "Not Found" response Given new "UpdateProtectionLevel" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" And body with value {"data": {"attributes": {"protectionLevel": "approval_required"}, "type": "protectionLevel"}} When the request is sent Then the response status is 404 Not Found - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Protection Level returns "OK" response Given new "UpdateProtectionLevel" request - And request contains "app_id" parameter from "REPLACE.ME" + And there is a valid "app" in the system + And request contains "app_id" parameter from "app.data.id" And body with value {"data": {"attributes": {"protectionLevel": "approval_required"}, "type": "protectionLevel"}} When the request is sent Then the response status is 200 OK + And the response "data.type" is equal to "appDefinitions" - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Update App Self-Service Status returns "Bad Request" response Given new "UpdateAppSelfService" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" And body with value {"data": {"attributes": {"selfService": true}, "type": "selfService"}} When the request is sent Then the response status is 400 Bad Request - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Self-Service Status returns "No Content" response Given new "UpdateAppSelfService" request - And request contains "app_id" parameter from "REPLACE.ME" + And there is a valid "app" in the system + And request contains "app_id" parameter from "app.data.id" And body with value {"data": {"attributes": {"selfService": true}, "type": "selfService"}} When the request is sent Then the response status is 204 No Content - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Self-Service Status returns "Not Found" response Given new "UpdateAppSelfService" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" And body with value {"data": {"attributes": {"selfService": true}, "type": "selfService"}} When the request is sent Then the response status is 404 Not Found - @generated @skip @team:DataDog/app-builder-backend + @skip @team:DataDog/app-builder-backend Scenario: Update App Tags returns "Bad Request" response Given new "UpdateAppTags" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "bad-app-id" And body with value {"data": {"attributes": {"tags": ["team:platform", "service:ops"]}, "type": "tags"}} When the request is sent Then the response status is 400 Bad Request - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Tags returns "No Content" response Given new "UpdateAppTags" request - And request contains "app_id" parameter from "REPLACE.ME" + And there is a valid "app" in the system + And request contains "app_id" parameter from "app.data.id" And body with value {"data": {"attributes": {"tags": ["team:platform", "service:ops"]}, "type": "tags"}} When the request is sent Then the response status is 204 No Content - @generated @skip @team:DataDog/app-builder-backend + @skip-typescript @team:DataDog/app-builder-backend Scenario: Update App Tags returns "Not Found" response Given new "UpdateAppTags" request - And request contains "app_id" parameter from "REPLACE.ME" + And request contains "app_id" parameter with value "7addb29b-f935-472c-ae79-d1963979a23e" And body with value {"data": {"attributes": {"tags": ["team:platform", "service:ops"]}, "type": "tags"}} When the request is sent Then the response status is 404 Not Found From 3a825335fc5e37f7a88e24a37e988e8e4b49bd40 Mon Sep 17 00:00:00 2001 From: "api-clients-generation-pipeline[bot]" <54105614+api-clients-generation-pipeline[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 19:14:18 +0000 Subject: [PATCH 3/4] Add escalation policy routing action with support hours and acknowledgment timeout to On-Call routing rules (#3294) Co-authored-by: ci.datadog-api-spec --- .generator/schemas/v2/openapi.yaml | 49 ++++- ...m-routing-rules-returns-OK-response.frozen | 2 +- ...team-routing-rules-returns-OK-response.yml | 58 +++--- .../v2/on-call/SetOnCallTeamRoutingRules.rb | 50 ++++- features/v2/on-call.feature | 2 +- lib/datadog_api_client/inflector.rb | 3 + .../v2/models/routing_rule_action.rb | 3 +- .../v2/models/routing_rule_attributes.rb | 2 +- .../routing_rule_escalation_policy_action.rb | 174 ++++++++++++++++++ ..._escalation_policy_action_support_hours.rb | 135 ++++++++++++++ ...ting_rule_escalation_policy_action_type.rb | 26 +++ .../models/team_routing_rules_request_rule.rb | 2 +- .../v2/models/time_restrictions.rb | 2 +- 13 files changed, 466 insertions(+), 42 deletions(-) create mode 100644 lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action.rb create mode 100644 lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_support_hours.rb create mode 100644 lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_type.rb diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index ac098a3c305d..27ad049e17c7 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -65461,6 +65461,7 @@ components: - $ref: "#/components/schemas/SendSlackMessageAction" - $ref: "#/components/schemas/SendTeamsMessageAction" - $ref: "#/components/schemas/TriggerWorkflowAutomationAction" + - $ref: "#/components/schemas/RoutingRuleEscalationPolicyAction" RoutingRuleAttributes: description: Defines the configurable attributes of a routing rule, such as actions, query, time restriction, and urgency. properties: @@ -65478,6 +65479,52 @@ components: urgency: $ref: "#/components/schemas/Urgency" type: object + RoutingRuleEscalationPolicyAction: + description: "Triggers an escalation policy." + properties: + ack_timeout_minutes: + description: "The number of minutes before an acknowledged page is re-triggered." + example: 30 + format: int64 + type: integer + policy_id: + description: "The ID of the escalation policy to route to." + example: "00000000-0000-0000-0000-000000000000" + type: string + support_hours: + $ref: "#/components/schemas/RoutingRuleEscalationPolicyActionSupportHours" + type: + $ref: "#/components/schemas/RoutingRuleEscalationPolicyActionType" + urgency: + $ref: "#/components/schemas/Urgency" + required: + - type + - policy_id + type: object + RoutingRuleEscalationPolicyActionSupportHours: + description: "Support hours during which the escalation policy will be executed. Outside of these hours, the escalation policy will be on hold and triggered once the next support hours window starts. This is mutually exclusive with the top-level `time_restriction` field on the routing rule." + properties: + restrictions: + description: "The list of support hours time windows." + items: + $ref: "#/components/schemas/TimeRestriction" + type: array + time_zone: + description: "The time zone in which the support hours are expressed." + example: "" + type: string + required: + - time_zone + type: object + RoutingRuleEscalationPolicyActionType: + default: escalation_policy + description: "Indicates that the action pages an escalation policy. This action can be set once per routing rule item, and is mutually exclusive with the top-level `policy_id` field on the routing rule." + enum: + - escalation_policy + example: escalation_policy + type: string + x-enum-varnames: + - ESCALATION_POLICY RoutingRuleRelationships: description: Specifies relationships for a routing rule, linking to associated policy resources. properties: @@ -85180,7 +85227,7 @@ components: type: string type: object TimeRestrictions: - description: Holds time zone information and a list of time restrictions for a routing rule. + description: Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level `support_hours` field. properties: restrictions: description: Defines the list of time-based restrictions. diff --git a/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.frozen b/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.frozen index 7a29240030ea..9eedde19e4d1 100644 --- a/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.frozen +++ b/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.frozen @@ -1 +1 @@ -2025-11-27T14:11:49.966Z \ No newline at end of file +2026-05-15T14:39:18.459Z \ No newline at end of file diff --git a/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.yml b/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.yml index 1b0da60b4aae..10a368beb074 100644 --- a/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.yml +++ b/cassettes/features/v2/on-call/Set-On-Call-team-routing-rules-returns-OK-response.yml @@ -1,9 +1,9 @@ http_interactions: -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: encoding: UTF-8 - string: '{"data":{"attributes":{"email":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709@datadoghq.com","title":"user + string: '{"data":{"attributes":{"email":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958@datadoghq.com","title":"user title"},"type":"users"}}' headers: Accept: @@ -15,7 +15,7 @@ http_interactions: response: body: encoding: UTF-8 - string: '{"data":{"type":"users","id":"0473ca92-cb9b-11f0-85f9-9a82ffe01443","attributes":{"name":null,"handle":"test-set_on_call_team_routing_rules_returns_ok_response-1764252709@datadoghq.com","created_at":"2025-11-27T14:11:50.355271+00:00","modified_at":"2025-11-27T14:11:50.355271+00:00","email":"test-set_on_call_team_routing_rules_returns_ok_response-1764252709@datadoghq.com","icon":"https://secure.gravatar.com/avatar/ad92f892fdf302962d879c0d02664d8e?s=48&d=retro","title":"user + string: '{"data":{"type":"users","id":"af4cfd73-8162-49c3-899a-101d0617d500","attributes":{"uuid":"af4cfd73-8162-49c3-899a-101d0617d500","name":null,"handle":"test-set_on_call_team_routing_rules_returns_ok_response-1778855958@datadoghq.com","created_at":"2026-05-15T14:39:20.154059+00:00","modified_at":"2026-05-15T14:39:20.154059+00:00","email":"test-set_on_call_team_routing_rules_returns_ok_response-1778855958@datadoghq.com","icon":"https://secure.gravatar.com/avatar/c530c1e2f9d5cddf9d34bed00a5e760b?s=48&d=retro","title":"user title","verified":false,"service_account":false,"disabled":false,"allowed_login_methods":[],"status":"Pending","last_login_time":null},"relationships":{"roles":{"data":[]},"org":{"data":{"type":"orgs","id":"4dee724d-00cc-11ea-a77b-570c9d03c6c5"}}}}} ' @@ -25,11 +25,11 @@ http_interactions: status: code: 201 message: Created -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: encoding: UTF-8 - string: '{"data":{"attributes":{"handle":"test-handle-a7692378c203a880","name":"test-name-a7692378c203a880"},"type":"team"}}' + string: '{"data":{"attributes":{"handle":"test-handle-fc62c73422bed141","name":"test-name-fc62c73422bed141"},"type":"team"}}' headers: Accept: - application/json @@ -40,19 +40,19 @@ http_interactions: response: body: encoding: UTF-8 - string: '{"data":{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team","attributes":{"avatar":null,"banner":14,"created_at":"2025-11-27T14:11:50.842947+00:00","description":null,"handle":"test-handle-a7692378c203a880","hidden_modules":[],"link_count":0,"modified_at":"2025-11-27T14:11:50.842947+00:00","name":"test-name-a7692378c203a880","summary":null,"user_count":0,"visible_modules":[]},"relationships":{"team_links":{"data":[],"links":{"related":"/api/v2/team/ba4fe917-0da4-4b40-96da-f9d7306d97d8/links"}},"user_team_permissions":{"links":{"related":"/api/v2/team/ba4fe917-0da4-4b40-96da-f9d7306d97d8/permission-settings"}}}}}' + string: '{"data":{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team","attributes":{"avatar":null,"banner":11,"created_at":"2026-05-15T14:39:20.573129+00:00","description":null,"handle":"test-handle-fc62c73422bed141","hidden_modules":null,"is_managed":false,"link_count":0,"modified_at":"2026-05-15T14:39:20.573129+00:00","name":"test-name-fc62c73422bed141","summary":null,"user_count":0,"visible_modules":null},"relationships":{"team_links":{"data":[],"links":{"related":"/api/v2/team/5f48616e-52b1-4126-a255-0bd9f4820dc1/links"}},"user_team_permissions":{"data":null,"links":{"related":"/api/v2/team/5f48616e-52b1-4126-a255-0bd9f4820dc1/permission-settings"}}}}}' headers: Content-Type: - application/vnd.api+json status: code: 201 message: Created -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: encoding: UTF-8 - string: '{"data":{"attributes":{"layers":[{"effective_date":"2025-11-17T14:11:49.966Z","end_date":"2025-12-07T14:11:49.966Z","interval":{"days":1},"members":[{"user":{"id":"0473ca92-cb9b-11f0-85f9-9a82ffe01443"}}],"name":"Layer - 1","restrictions":[{"end_day":"friday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"}],"rotation_start":"2025-11-22T14:11:49.966Z"}],"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","time_zone":"America/New_York"},"relationships":{"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}},"type":"schedules"}}' + string: '{"data":{"attributes":{"layers":[{"effective_date":"2026-05-05T14:39:18.459Z","end_date":"2026-05-25T14:39:18.459Z","interval":{"days":1},"members":[{"user":{"id":"af4cfd73-8162-49c3-899a-101d0617d500"}}],"name":"Layer + 1","restrictions":[{"end_day":"friday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"}],"rotation_start":"2026-05-10T14:39:18.459Z"}],"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","time_zone":"America/New_York"},"relationships":{"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}},"type":"schedules"}}' headers: Accept: - application/json @@ -63,18 +63,18 @@ http_interactions: response: body: encoding: UTF-8 - string: '{"data":{"id":"1f9b0595-17a3-4d95-9b2e-edcea3b6e737","type":"schedules","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","time_zone":"America/New_York"},"relationships":{"layers":{"data":[{"id":"0eecb6fe-83c6-48c9-9e0e-82379498f733","type":"layers"}]},"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}}}}' + string: '{"data":{"id":"6417bbaa-a75e-474d-a45a-9af8e1a3907a","type":"schedules","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","time_zone":"America/New_York"},"relationships":{"layers":{"data":[{"id":"d2139431-973b-42cc-a932-941aeff81783","type":"layers"}]},"teams":{"data":[{"id":"65aea9d0-941c-4607-bf8a-14fc0dac2820","type":"teams"}]}}}}' headers: Content-Type: - application/vnd.api+json status: code: 201 message: Created -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: encoding: UTF-8 - string: '{"data":{"attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","resolve_page_on_policy_end":true,"retries":2,"steps":[{"assignment":"default","escalate_after_seconds":3600,"targets":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"},{"id":"1f9b0595-17a3-4d95-9b2e-edcea3b6e737","type":"schedules"},{"config":{"schedule":{"position":"previous"}},"id":"1f9b0595-17a3-4d95-9b2e-edcea3b6e737","type":"schedules"},{"id":"0473ca92-cb9b-11f0-85f9-9a82ffe01443","type":"users"}]},{"assignment":"round-robin","escalate_after_seconds":3600,"targets":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"}]}]},"relationships":{"teams":{"data":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"}]}},"type":"policies"}}' + string: '{"data":{"attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","resolve_page_on_policy_end":true,"retries":2,"steps":[{"assignment":"default","escalate_after_seconds":3600,"targets":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"},{"id":"6417bbaa-a75e-474d-a45a-9af8e1a3907a","type":"schedules"},{"config":{"schedule":{"position":"previous"}},"id":"6417bbaa-a75e-474d-a45a-9af8e1a3907a","type":"schedules"},{"id":"af4cfd73-8162-49c3-899a-101d0617d500","type":"users"}]},{"assignment":"round-robin","escalate_after_seconds":3600,"targets":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"}]}]},"relationships":{"teams":{"data":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"}]}},"type":"policies"}}' headers: Accept: - application/json @@ -85,65 +85,65 @@ http_interactions: response: body: encoding: UTF-8 - string: '{"data":{"id":"66f0e922-2834-4d68-aa0b-98cc81fc2a9d","type":"policies","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1764252709","resolve_page_on_policy_end":true,"retries":2},"relationships":{"steps":{"data":[{"id":"533f661e-6a1f-4327-8d3f-035add94cff8","type":"steps"},{"id":"b8948730-6aec-4a51-8662-cce4026b94dc","type":"steps"}]},"teams":{"data":[{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"teams"}]}}}}' + string: '{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies","attributes":{"name":"Test-Set_On_Call_team_routing_rules_returns_OK_response-1778855958","resolve_page_on_policy_end":true,"retries":2,"tags":[]},"relationships":{"steps":{"data":[{"id":"cd41c9ed-3d97-469c-aa8a-9a36c0f45a82","type":"steps"},{"id":"102b0afe-da23-48ca-be15-699891fcbff7","type":"steps"}]},"teams":{"data":[{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"teams"}]}}}}' headers: Content-Type: - application/vnd.api+json status: code: 201 message: Created -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: encoding: UTF-8 - string: '{"data":{"attributes":{"rules":[{"actions":[{"channel":"channel","type":"send_slack_message","workspace":"workspace"}],"query":"tags.service:test","time_restriction":{"restrictions":[{"end_day":"monday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"},{"end_day":"tuesday","end_time":"17:00:00","start_day":"tuesday","start_time":"09:00:00"}],"time_zone":"Europe/Paris"}},{"policy_id":"66f0e922-2834-4d68-aa0b-98cc81fc2a9d","query":"","urgency":"low"}]},"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules"}}' + string: '{"data":{"attributes":{"rules":[{"actions":[{"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"escalation_policy","urgency":"low"}],"query":"tags.service:time_restrictions","time_restriction":{"restrictions":[{"end_day":"monday","end_time":"17:00:00","start_day":"monday","start_time":"09:00:00"},{"end_day":"tuesday","end_time":"17:00:00","start_day":"tuesday","start_time":"09:00:00"}],"time_zone":"Europe/Paris"}},{"actions":[{"ack_timeout_minutes":30,"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","support_hours":{"restrictions":[{"end_day":"wednesday","end_time":"17:00:00","start_day":"wednesday","start_time":"09:00:00"},{"end_day":"thursday","end_time":"17:00:00","start_day":"thursday","start_time":"09:00:00"}],"time_zone":"Europe/Paris"},"type":"escalation_policy","urgency":"low"}],"query":"tags.service:support_hours_and_acknowledgment_timeout"},{"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","query":"tags.service:legacy_policy_definition","urgency":"low"},{"actions":[{"policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"escalation_policy","urgency":"low"}],"query":""}]},"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules"}}' headers: Accept: - application/json Content-Type: - application/json method: PUT - uri: https://api.datadoghq.com/api/v2/on-call/teams/ba4fe917-0da4-4b40-96da-f9d7306d97d8/routing-rules?include=rules + uri: https://api.datadoghq.com/api/v2/on-call/teams/5f48616e-52b1-4126-a255-0bd9f4820dc1/routing-rules?include=rules response: body: encoding: UTF-8 - string: '{"data":{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules","relationships":{"rules":{"data":[{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-0","type":"team_routing_rules"},{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-1","type":"team_routing_rules"}]}}},"included":[{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-0","type":"team_routing_rules","attributes":{"actions":[{"type":"send_slack_message","channel":"channel","workspace":"workspace"}],"query":"tags.service:test","time_restriction":{"time_zone":"Europe/Paris","restrictions":[{"start_time":"09:00:00","start_day":"monday","end_time":"17:00:00","end_day":"monday"},{"start_time":"09:00:00","start_day":"tuesday","end_time":"17:00:00","end_day":"tuesday"}]}},"relationships":{"policy":{"data":null}}},{"id":"virtual-ba4fe917-0da4-4b40-96da-f9d7306d97d8-rule-1","type":"team_routing_rules","attributes":{"actions":[],"query":"","urgency":"low"},"relationships":{"policy":{"data":{"id":"66f0e922-2834-4d68-aa0b-98cc81fc2a9d","type":"policies"}}}}]}' + string: '{"data":{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules","relationships":{"rules":{"data":[{"id":"d4a7d064-0b02-4510-9412-24c95fdbef89","type":"team_routing_rules"},{"id":"a1a5fdd6-dd2b-4571-a86c-909a89a21490","type":"team_routing_rules"},{"id":"fdbe9494-e88c-4927-bb7e-407c0df33258","type":"team_routing_rules"},{"id":"8e059ecb-b492-4db6-accd-6eb69b4099b1","type":"team_routing_rules"}]}}},"included":[{"id":"d4a7d064-0b02-4510-9412-24c95fdbef89","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","urgency":"low"}],"query":"tags.service:time_restrictions","time_restriction":{"time_zone":"Europe/Paris","restrictions":[{"start_time":"09:00:00","start_day":"monday","end_time":"17:00:00","end_day":"monday"},{"start_time":"09:00:00","start_day":"tuesday","end_time":"17:00:00","end_day":"tuesday"}]},"urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}},{"id":"a1a5fdd6-dd2b-4571-a86c-909a89a21490","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","support_hours":{"time_zone":"Europe/Paris","restrictions":[{"start_time":"09:00:00","start_day":"wednesday","end_time":"17:00:00","end_day":"wednesday"},{"start_time":"09:00:00","start_day":"thursday","end_time":"17:00:00","end_day":"thursday"}]},"ack_timeout_minutes":30,"urgency":"low"}],"query":"tags.service:support_hours_and_acknowledgment_timeout","urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}},{"id":"fdbe9494-e88c-4927-bb7e-407c0df33258","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","urgency":"low"}],"query":"tags.service:legacy_policy_definition","urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}},{"id":"8e059ecb-b492-4db6-accd-6eb69b4099b1","type":"team_routing_rules","attributes":{"actions":[{"type":"escalation_policy","policy_id":"3321cfa1-8420-4655-ac38-f51ea522834e","urgency":"low"}],"query":"","urgency":"low"},"relationships":{"policy":{"data":{"id":"3321cfa1-8420-4655-ac38-f51ea522834e","type":"policies"}}}}]}' headers: Content-Type: - application/vnd.api+json status: code: 200 message: OK -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: encoding: UTF-8 - string: '{"data":{"attributes":{"rules":[]},"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules"}}' + string: '{"data":{"attributes":{"rules":[]},"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules"}}' headers: Accept: - application/json Content-Type: - application/json method: PUT - uri: https://api.datadoghq.com/api/v2/on-call/teams/ba4fe917-0da4-4b40-96da-f9d7306d97d8/routing-rules + uri: https://api.datadoghq.com/api/v2/on-call/teams/5f48616e-52b1-4126-a255-0bd9f4820dc1/routing-rules response: body: encoding: UTF-8 - string: '{"data":{"id":"ba4fe917-0da4-4b40-96da-f9d7306d97d8","type":"team_routing_rules","relationships":{"rules":{"data":[]}}}}' + string: '{"data":{"id":"5f48616e-52b1-4126-a255-0bd9f4820dc1","type":"team_routing_rules","relationships":{"rules":{"data":[]}}}}' headers: Content-Type: - application/vnd.api+json status: code: 200 message: OK -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: null headers: Accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/on-call/escalation-policies/66f0e922-2834-4d68-aa0b-98cc81fc2a9d + uri: https://api.datadoghq.com/api/v2/on-call/escalation-policies/3321cfa1-8420-4655-ac38-f51ea522834e response: body: encoding: UTF-8 @@ -152,14 +152,14 @@ http_interactions: status: code: 204 message: No Content -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: null headers: Accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/on-call/schedules/1f9b0595-17a3-4d95-9b2e-edcea3b6e737 + uri: https://api.datadoghq.com/api/v2/on-call/schedules/6417bbaa-a75e-474d-a45a-9af8e1a3907a response: body: encoding: UTF-8 @@ -168,14 +168,14 @@ http_interactions: status: code: 204 message: No Content -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: null headers: Accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/team/ba4fe917-0da4-4b40-96da-f9d7306d97d8 + uri: https://api.datadoghq.com/api/v2/team/5f48616e-52b1-4126-a255-0bd9f4820dc1 response: body: encoding: UTF-8 @@ -184,14 +184,14 @@ http_interactions: status: code: 204 message: No Content -- recorded_at: Thu, 27 Nov 2025 14:11:49 GMT +- recorded_at: Fri, 15 May 2026 14:39:18 GMT request: body: null headers: Accept: - '*/*' method: DELETE - uri: https://api.datadoghq.com/api/v2/users/0473ca92-cb9b-11f0-85f9-9a82ffe01443 + uri: https://api.datadoghq.com/api/v2/users/af4cfd73-8162-49c3-899a-101d0617d500 response: body: encoding: UTF-8 diff --git a/examples/v2/on-call/SetOnCallTeamRoutingRules.rb b/examples/v2/on-call/SetOnCallTeamRoutingRules.rb index f293be78238d..cbad2925d04b 100644 --- a/examples/v2/on-call/SetOnCallTeamRoutingRules.rb +++ b/examples/v2/on-call/SetOnCallTeamRoutingRules.rb @@ -15,13 +15,13 @@ rules: [ DatadogAPIClient::V2::TeamRoutingRulesRequestRule.new({ actions: [ - DatadogAPIClient::V2::SendSlackMessageAction.new({ - channel: "channel", - type: DatadogAPIClient::V2::SendSlackMessageActionType::SEND_SLACK_MESSAGE, - workspace: "workspace", + DatadogAPIClient::V2::RoutingRuleEscalationPolicyAction.new({ + type: DatadogAPIClient::V2::RoutingRuleEscalationPolicyActionType::ESCALATION_POLICY, + policy_id: ESCALATION_POLICY_DATA_ID, + urgency: DatadogAPIClient::V2::Urgency::LOW, }), ], - query: "tags.service:test", + query: "tags.service:time_restrictions", time_restriction: DatadogAPIClient::V2::TimeRestrictions.new({ time_zone: "Europe/Paris", restrictions: [ @@ -40,11 +40,49 @@ ], }), }), + DatadogAPIClient::V2::TeamRoutingRulesRequestRule.new({ + actions: [ + DatadogAPIClient::V2::RoutingRuleEscalationPolicyAction.new({ + type: DatadogAPIClient::V2::RoutingRuleEscalationPolicyActionType::ESCALATION_POLICY, + policy_id: ESCALATION_POLICY_DATA_ID, + urgency: DatadogAPIClient::V2::Urgency::LOW, + ack_timeout_minutes: 30, + support_hours: DatadogAPIClient::V2::RoutingRuleEscalationPolicyActionSupportHours.new({ + time_zone: "Europe/Paris", + restrictions: [ + DatadogAPIClient::V2::TimeRestriction.new({ + end_day: DatadogAPIClient::V2::Weekday::WEDNESDAY, + end_time: "17:00:00", + start_day: DatadogAPIClient::V2::Weekday::WEDNESDAY, + start_time: "09:00:00", + }), + DatadogAPIClient::V2::TimeRestriction.new({ + end_day: DatadogAPIClient::V2::Weekday::THURSDAY, + end_time: "17:00:00", + start_day: DatadogAPIClient::V2::Weekday::THURSDAY, + start_time: "09:00:00", + }), + ], + }), + }), + ], + query: "tags.service:support_hours_and_acknowledgment_timeout", + }), DatadogAPIClient::V2::TeamRoutingRulesRequestRule.new({ policy_id: ESCALATION_POLICY_DATA_ID, - query: "", + query: "tags.service:legacy_policy_definition", urgency: DatadogAPIClient::V2::Urgency::LOW, }), + DatadogAPIClient::V2::TeamRoutingRulesRequestRule.new({ + actions: [ + DatadogAPIClient::V2::RoutingRuleEscalationPolicyAction.new({ + type: DatadogAPIClient::V2::RoutingRuleEscalationPolicyActionType::ESCALATION_POLICY, + policy_id: ESCALATION_POLICY_DATA_ID, + urgency: DatadogAPIClient::V2::Urgency::LOW, + }), + ], + query: "", + }), ], }), id: DD_TEAM_DATA_ID, diff --git a/features/v2/on-call.feature b/features/v2/on-call.feature index 0f4b2a0e3402..a4ea9a7c4f08 100644 --- a/features/v2/on-call.feature +++ b/features/v2/on-call.feature @@ -401,7 +401,7 @@ Feature: On-Call And there is a valid "schedule" in the system And there is a valid "escalation_policy" in the system And request contains "team_id" parameter from "dd_team.data.id" - And body with value {"data": {"attributes": {"rules": [{"actions": [{"channel": "channel", "type": "send_slack_message", "workspace": "workspace"}], "query": "tags.service:test", "time_restriction": {"time_zone": "Europe/Paris", "restrictions": [{"end_day": "monday", "end_time": "17:00:00", "start_day": "monday", "start_time": "09:00:00"}, {"end_day": "tuesday", "end_time": "17:00:00", "start_day": "tuesday", "start_time": "09:00:00"}]}}, {"policy_id": "{{ escalation_policy.data.id }}", "query": "", "urgency": "low"}]}, "id": "{{ dd_team.data.id }}", "type": "team_routing_rules"}} + And body with value {"data": {"attributes": {"rules": [{"actions": [{"type": "escalation_policy", "policy_id": "{{ escalation_policy.data.id }}", "urgency": "low"}], "query": "tags.service:time_restrictions", "time_restriction": {"time_zone": "Europe/Paris", "restrictions": [{"end_day": "monday", "end_time": "17:00:00", "start_day": "monday", "start_time": "09:00:00"}, {"end_day": "tuesday", "end_time": "17:00:00", "start_day": "tuesday", "start_time": "09:00:00"}]}}, {"actions": [{"type": "escalation_policy", "policy_id": "{{ escalation_policy.data.id }}", "urgency": "low", "ack_timeout_minutes": 30, "support_hours": {"time_zone": "Europe/Paris", "restrictions": [{"end_day": "wednesday", "end_time": "17:00:00", "start_day": "wednesday", "start_time": "09:00:00"}, {"end_day": "thursday", "end_time": "17:00:00", "start_day": "thursday", "start_time": "09:00:00"}]}}], "query": "tags.service:support_hours_and_acknowledgment_timeout"}, {"policy_id": "{{ escalation_policy.data.id }}", "query": "tags.service:legacy_policy_definition", "urgency": "low"}, {"actions": [{"type": "escalation_policy", "policy_id": "{{ escalation_policy.data.id }}", "urgency": "low"}], "query": ""}]}, "id": "{{ dd_team.data.id }}", "type": "team_routing_rules"}} And request contains "include" parameter with value "rules" When the request is sent Then the response status is 200 OK diff --git a/lib/datadog_api_client/inflector.rb b/lib/datadog_api_client/inflector.rb index a9b20652de22..9e8451285fa8 100644 --- a/lib/datadog_api_client/inflector.rb +++ b/lib/datadog_api_client/inflector.rb @@ -5157,6 +5157,9 @@ def overrides "v2.routing_rule" => "RoutingRule", "v2.routing_rule_action" => "RoutingRuleAction", "v2.routing_rule_attributes" => "RoutingRuleAttributes", + "v2.routing_rule_escalation_policy_action" => "RoutingRuleEscalationPolicyAction", + "v2.routing_rule_escalation_policy_action_support_hours" => "RoutingRuleEscalationPolicyActionSupportHours", + "v2.routing_rule_escalation_policy_action_type" => "RoutingRuleEscalationPolicyActionType", "v2.routing_rule_relationships" => "RoutingRuleRelationships", "v2.routing_rule_relationships_policy" => "RoutingRuleRelationshipsPolicy", "v2.routing_rule_relationships_policy_data" => "RoutingRuleRelationshipsPolicyData", diff --git a/lib/datadog_api_client/v2/models/routing_rule_action.rb b/lib/datadog_api_client/v2/models/routing_rule_action.rb index cd4d3b04d05d..3ae2b1f7a81f 100644 --- a/lib/datadog_api_client/v2/models/routing_rule_action.rb +++ b/lib/datadog_api_client/v2/models/routing_rule_action.rb @@ -28,7 +28,8 @@ def openapi_one_of [ :'SendSlackMessageAction', :'SendTeamsMessageAction', - :'TriggerWorkflowAutomationAction' + :'TriggerWorkflowAutomationAction', + :'RoutingRuleEscalationPolicyAction' ] end # Builds the object diff --git a/lib/datadog_api_client/v2/models/routing_rule_attributes.rb b/lib/datadog_api_client/v2/models/routing_rule_attributes.rb index b5f95d50bd6f..fa8694906ba9 100644 --- a/lib/datadog_api_client/v2/models/routing_rule_attributes.rb +++ b/lib/datadog_api_client/v2/models/routing_rule_attributes.rb @@ -27,7 +27,7 @@ class RoutingRuleAttributes # Defines the query or condition that triggers this routing rule. attr_accessor :query - # Holds time zone information and a list of time restrictions for a routing rule. + # Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level `support_hours` field. attr_accessor :time_restriction # Specifies the level of urgency for a routing rule (low, high, or dynamic). diff --git a/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action.rb b/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action.rb new file mode 100644 index 000000000000..91dbf14722ae --- /dev/null +++ b/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action.rb @@ -0,0 +1,174 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Triggers an escalation policy. + class RoutingRuleEscalationPolicyAction + include BaseGenericModel + + # The number of minutes before an acknowledged page is re-triggered. + attr_accessor :ack_timeout_minutes + + # The ID of the escalation policy to route to. + attr_reader :policy_id + + # Support hours during which the escalation policy will be executed. Outside of these hours, the escalation policy will be on hold and triggered once the next support hours window starts. This is mutually exclusive with the top-level `time_restriction` field on the routing rule. + attr_accessor :support_hours + + # Indicates that the action pages an escalation policy. This action can be set once per routing rule item, and is mutually exclusive with the top-level `policy_id` field on the routing rule. + attr_reader :type + + # Specifies the level of urgency for a routing rule (low, high, or dynamic). + attr_accessor :urgency + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'ack_timeout_minutes' => :'ack_timeout_minutes', + :'policy_id' => :'policy_id', + :'support_hours' => :'support_hours', + :'type' => :'type', + :'urgency' => :'urgency' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'ack_timeout_minutes' => :'Integer', + :'policy_id' => :'String', + :'support_hours' => :'RoutingRuleEscalationPolicyActionSupportHours', + :'type' => :'RoutingRuleEscalationPolicyActionType', + :'urgency' => :'Urgency' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::RoutingRuleEscalationPolicyAction` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'ack_timeout_minutes') + self.ack_timeout_minutes = attributes[:'ack_timeout_minutes'] + end + + if attributes.key?(:'policy_id') + self.policy_id = attributes[:'policy_id'] + end + + if attributes.key?(:'support_hours') + self.support_hours = attributes[:'support_hours'] + end + + if attributes.key?(:'type') + self.type = attributes[:'type'] + end + + if attributes.key?(:'urgency') + self.urgency = attributes[:'urgency'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @policy_id.nil? + return false if @type.nil? + true + end + + # Custom attribute writer method with validation + # @param policy_id [Object] Object to be assigned + # @!visibility private + def policy_id=(policy_id) + if policy_id.nil? + fail ArgumentError, 'invalid value for "policy_id", policy_id cannot be nil.' + end + @policy_id = policy_id + end + + # Custom attribute writer method with validation + # @param type [Object] Object to be assigned + # @!visibility private + def type=(type) + if type.nil? + fail ArgumentError, 'invalid value for "type", type cannot be nil.' + end + @type = type + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + ack_timeout_minutes == o.ack_timeout_minutes && + policy_id == o.policy_id && + support_hours == o.support_hours && + type == o.type && + urgency == o.urgency && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [ack_timeout_minutes, policy_id, support_hours, type, urgency, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_support_hours.rb b/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_support_hours.rb new file mode 100644 index 000000000000..04c5f8fca2ec --- /dev/null +++ b/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_support_hours.rb @@ -0,0 +1,135 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Support hours during which the escalation policy will be executed. Outside of these hours, the escalation policy will be on hold and triggered once the next support hours window starts. This is mutually exclusive with the top-level `time_restriction` field on the routing rule. + class RoutingRuleEscalationPolicyActionSupportHours + include BaseGenericModel + + # The list of support hours time windows. + attr_accessor :restrictions + + # The time zone in which the support hours are expressed. + attr_reader :time_zone + + attr_accessor :additional_properties + + # Attribute mapping from ruby-style variable name to JSON key. + # @!visibility private + def self.attribute_map + { + :'restrictions' => :'restrictions', + :'time_zone' => :'time_zone' + } + end + + # Attribute type mapping. + # @!visibility private + def self.openapi_types + { + :'restrictions' => :'Array', + :'time_zone' => :'String' + } + end + + # Initializes the object + # @param attributes [Hash] Model attributes in the form of hash + # @!visibility private + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `DatadogAPIClient::V2::RoutingRuleEscalationPolicyActionSupportHours` initialize method" + end + + self.additional_properties = {} + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + self.additional_properties[k.to_sym] = v + else + h[k.to_sym] = v + end + } + + if attributes.key?(:'restrictions') + if (value = attributes[:'restrictions']).is_a?(Array) + self.restrictions = value + end + end + + if attributes.key?(:'time_zone') + self.time_zone = attributes[:'time_zone'] + end + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + # @!visibility private + def valid? + return false if @time_zone.nil? + true + end + + # Custom attribute writer method with validation + # @param time_zone [Object] Object to be assigned + # @!visibility private + def time_zone=(time_zone) + if time_zone.nil? + fail ArgumentError, 'invalid value for "time_zone", time_zone cannot be nil.' + end + @time_zone = time_zone + end + + # Returns the object in the form of hash, with additionalProperties support. + # @return [Hash] Returns the object in the form of hash + # @!visibility private + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + self.additional_properties.each_pair do |attr, value| + hash[attr] = value + end + hash + end + + # Checks equality by comparing each attribute. + # @param o [Object] Object to be compared + # @!visibility private + def ==(o) + return true if self.equal?(o) + self.class == o.class && + restrictions == o.restrictions && + time_zone == o.time_zone && + additional_properties == o.additional_properties + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + # @!visibility private + def hash + [restrictions, time_zone, additional_properties].hash + end + end +end diff --git a/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_type.rb b/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_type.rb new file mode 100644 index 000000000000..da60c3b47d0f --- /dev/null +++ b/lib/datadog_api_client/v2/models/routing_rule_escalation_policy_action_type.rb @@ -0,0 +1,26 @@ +=begin +#Datadog API V2 Collection + +#Collection of all Datadog Public endpoints. + +The version of the OpenAPI document: 1.0 +Contact: support@datadoghq.com +Generated by: https://github.com/DataDog/datadog-api-client-ruby/tree/master/.generator + + 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 2020-Present Datadog, Inc. + +=end + +require 'date' +require 'time' + +module DatadogAPIClient::V2 + # Indicates that the action pages an escalation policy. This action can be set once per routing rule item, and is mutually exclusive with the top-level `policy_id` field on the routing rule. + class RoutingRuleEscalationPolicyActionType + include BaseEnumModel + + ESCALATION_POLICY = "escalation_policy".freeze + end +end diff --git a/lib/datadog_api_client/v2/models/team_routing_rules_request_rule.rb b/lib/datadog_api_client/v2/models/team_routing_rules_request_rule.rb index 94f570034186..96634dd2f255 100644 --- a/lib/datadog_api_client/v2/models/team_routing_rules_request_rule.rb +++ b/lib/datadog_api_client/v2/models/team_routing_rules_request_rule.rb @@ -30,7 +30,7 @@ class TeamRoutingRulesRequestRule # Defines the query or condition that triggers this routing rule. attr_accessor :query - # Holds time zone information and a list of time restrictions for a routing rule. + # Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level `support_hours` field. attr_accessor :time_restriction # Specifies the level of urgency for a routing rule (low, high, or dynamic). diff --git a/lib/datadog_api_client/v2/models/time_restrictions.rb b/lib/datadog_api_client/v2/models/time_restrictions.rb index 6c4e7de5ddc1..6ed174eabb6f 100644 --- a/lib/datadog_api_client/v2/models/time_restrictions.rb +++ b/lib/datadog_api_client/v2/models/time_restrictions.rb @@ -17,7 +17,7 @@ require 'time' module DatadogAPIClient::V2 - # Holds time zone information and a list of time restrictions for a routing rule. + # Time restrictions during which the routing rule is active. Outside of these hours, the rule does not match and routing continues to subsequent rules. This is mutually exclusive with the action-level `support_hours` field. class TimeRestrictions include BaseGenericModel From 641cb81dbc2f895ee37dd75fff1a353283874e69 Mon Sep 17 00:00:00 2001 From: "api-clients-generation-pipeline[bot]" <54105614+api-clients-generation-pipeline[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 17:32:17 -0400 Subject: [PATCH 4/4] Regenerate client from commit 7dbcff9 of spec repo (#3352) Co-authored-by: ci.datadog-api-spec --- .generator/schemas/v1/openapi.yaml | 12 ++++++++++++ .../v1/models/usage_summary_date.rb | 12 +++++++++++- .../v1/models/usage_summary_date_org.rb | 12 +++++++++++- .../v1/models/usage_summary_response.rb | 12 +++++++++++- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index a0aad169eda9..51fe22bcea0c 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -22607,6 +22607,10 @@ components: description: Shows the average of all normalized Database Monitoring queries over all hours in the current date for all organizations. format: int64 type: integer + do_jobs_monitoring_orchestrators_job_hours_sum: + description: Shows the sum of all orchestrator job hours over all hours in the current date for all organizations. + format: int64 + type: integer eph_infra_host_agent_sum: description: Shows the sum of all ephemeral infrastructure hosts with the Datadog Agent over all hours in the current date for the given org. format: int64 @@ -23620,6 +23624,10 @@ components: description: Shows the average of all distinct Database Monitoring normalized queries over all hours in the current month for the given org. format: int64 type: integer + do_jobs_monitoring_orchestrators_job_hours_sum: + description: Shows the sum of all orchestrator job hours over all hours in the current date for the given org. + format: int64 + type: integer eph_infra_host_agent_sum: description: Shows the sum of all ephemeral infrastructure hosts with the Datadog Agent over all hours in the current date for the given org. format: int64 @@ -24639,6 +24647,10 @@ components: description: Shows the average of all distinct Database Monitoring Normalized Queries over all hours in the current month for all organizations. format: int64 type: integer + do_jobs_monitoring_orchestrators_job_hours_agg_sum: + description: Shows the sum of all orchestrator job hours over all hours in the current month for all organizations. + format: int64 + type: integer end_date: description: Shows the last date of usage in the current month for all organizations. format: date-time diff --git a/lib/datadog_api_client/v1/models/usage_summary_date.rb b/lib/datadog_api_client/v1/models/usage_summary_date.rb index 808409050987..95b06237e5ce 100644 --- a/lib/datadog_api_client/v1/models/usage_summary_date.rb +++ b/lib/datadog_api_client/v1/models/usage_summary_date.rb @@ -276,6 +276,9 @@ class UsageSummaryDate # Shows the average of all normalized Database Monitoring queries over all hours in the current date for all organizations. attr_accessor :dbm_queries_count_avg + # Shows the sum of all orchestrator job hours over all hours in the current date for all organizations. + attr_accessor :do_jobs_monitoring_orchestrators_job_hours_sum + # Shows the sum of all ephemeral infrastructure hosts with the Datadog Agent over all hours in the current date for the given org. attr_accessor :eph_infra_host_agent_sum @@ -850,6 +853,7 @@ def self.attribute_map :'date' => :'date', :'dbm_host_top99p' => :'dbm_host_top99p', :'dbm_queries_count_avg' => :'dbm_queries_count_avg', + :'do_jobs_monitoring_orchestrators_job_hours_sum' => :'do_jobs_monitoring_orchestrators_job_hours_sum', :'eph_infra_host_agent_sum' => :'eph_infra_host_agent_sum', :'eph_infra_host_alibaba_sum' => :'eph_infra_host_alibaba_sum', :'eph_infra_host_aws_sum' => :'eph_infra_host_aws_sum', @@ -1103,6 +1107,7 @@ def self.openapi_types :'date' => :'Time', :'dbm_host_top99p' => :'Integer', :'dbm_queries_count_avg' => :'Integer', + :'do_jobs_monitoring_orchestrators_job_hours_sum' => :'Integer', :'eph_infra_host_agent_sum' => :'Integer', :'eph_infra_host_alibaba_sum' => :'Integer', :'eph_infra_host_aws_sum' => :'Integer', @@ -1625,6 +1630,10 @@ def initialize(attributes = {}) self.dbm_queries_count_avg = attributes[:'dbm_queries_count_avg'] end + if attributes.key?(:'do_jobs_monitoring_orchestrators_job_hours_sum') + self.do_jobs_monitoring_orchestrators_job_hours_sum = attributes[:'do_jobs_monitoring_orchestrators_job_hours_sum'] + end + if attributes.key?(:'eph_infra_host_agent_sum') self.eph_infra_host_agent_sum = attributes[:'eph_infra_host_agent_sum'] end @@ -2383,6 +2392,7 @@ def ==(o) date == o.date && dbm_host_top99p == o.dbm_host_top99p && dbm_queries_count_avg == o.dbm_queries_count_avg && + do_jobs_monitoring_orchestrators_job_hours_sum == o.do_jobs_monitoring_orchestrators_job_hours_sum && eph_infra_host_agent_sum == o.eph_infra_host_agent_sum && eph_infra_host_alibaba_sum == o.eph_infra_host_alibaba_sum && eph_infra_host_aws_sum == o.eph_infra_host_aws_sum && @@ -2551,7 +2561,7 @@ def ==(o) # @return [Integer] Hash code # @!visibility private def hash - [agent_host_top99p, apm_azure_app_service_host_top99p, apm_devsecops_host_top99p, apm_enterprise_standalone_hosts_top99p, apm_fargate_count_avg, apm_host_top99p, apm_pro_standalone_hosts_top99p, appsec_fargate_count_avg, asm_serverless_sum, audit_logs_lines_indexed_sum, audit_trail_enabled_hwm, avg_profiled_fargate_tasks, aws_host_top99p, aws_lambda_func_count, aws_lambda_invocations_sum, azure_app_service_top99p, billable_ingested_bytes_sum, bits_ai_investigations_sum, browser_rum_lite_session_count_sum, browser_rum_replay_session_count_sum, browser_rum_units_sum, ccm_anthropic_spend_last, ccm_aws_spend_last, ccm_azure_spend_last, ccm_confluent_spend_last, ccm_databricks_spend_last, ccm_elastic_spend_last, ccm_fastly_spend_last, ccm_gcp_spend_last, ccm_github_spend_last, ccm_mongodb_spend_last, ccm_oci_spend_last, ccm_openai_spend_last, ccm_snowflake_spend_last, ccm_spend_monitored_ent_last, ccm_spend_monitored_pro_last, ccm_twilio_spend_last, ci_pipeline_indexed_spans_sum, ci_test_indexed_spans_sum, ci_visibility_itr_committers_hwm, ci_visibility_pipeline_committers_hwm, ci_visibility_test_committers_hwm, cloud_cost_management_aws_host_count_avg, cloud_cost_management_azure_host_count_avg, cloud_cost_management_gcp_host_count_avg, cloud_cost_management_host_count_avg, cloud_cost_management_oci_host_count_avg, cloud_siem_events_sum, code_analysis_sa_committers_hwm, code_analysis_sca_committers_hwm, code_security_host_top99p, container_avg, container_excl_agent_avg, container_hwm, csm_container_enterprise_compliance_count_sum, csm_container_enterprise_cws_count_sum, csm_container_enterprise_total_count_sum, csm_host_enterprise_aas_host_count_top99p, csm_host_enterprise_aws_host_count_top99p, csm_host_enterprise_azure_host_count_top99p, csm_host_enterprise_compliance_host_count_top99p, csm_host_enterprise_cws_host_count_top99p, csm_host_enterprise_gcp_host_count_top99p, csm_host_enterprise_oci_host_count_top99p, csm_host_enterprise_total_host_count_top99p, csm_host_pro_hosts_agentless_scanners_sum, csm_host_pro_hosts_agentless_scanners_top99p, csm_host_pro_oci_host_count_top99p, cspm_aas_host_top99p, cspm_aws_host_top99p, cspm_azure_host_top99p, cspm_container_avg, cspm_container_hwm, cspm_gcp_host_top99p, cspm_host_top99p, cspm_hosts_agentless_scanners_sum, cspm_hosts_agentless_scanners_top99p, custom_ts_avg, cws_container_count_avg, cws_fargate_task_avg, cws_host_top99p, data_jobs_monitoring_host_hr_sum, date, dbm_host_top99p, dbm_queries_count_avg, eph_infra_host_agent_sum, eph_infra_host_alibaba_sum, eph_infra_host_aws_sum, eph_infra_host_azure_sum, eph_infra_host_basic_infra_basic_agent_sum, eph_infra_host_basic_infra_basic_vsphere_sum, eph_infra_host_basic_sum, eph_infra_host_ent_sum, eph_infra_host_gcp_sum, eph_infra_host_heroku_sum, eph_infra_host_only_aas_sum, eph_infra_host_only_vsphere_sum, eph_infra_host_opentelemetry_apm_sum, eph_infra_host_opentelemetry_sum, eph_infra_host_pro_sum, eph_infra_host_proplus_sum, eph_infra_host_proxmox_sum, error_tracking_apm_error_events_sum, error_tracking_error_events_sum, error_tracking_events_sum, error_tracking_rum_error_events_sum, event_management_correlation_correlated_events_sum, event_management_correlation_correlated_related_events_sum, event_management_correlation_sum, fargate_container_profiler_profiling_fargate_avg, fargate_container_profiler_profiling_fargate_eks_avg, fargate_tasks_count_avg, fargate_tasks_count_hwm, feature_flags_config_requests_sum, flex_logs_compute_large_avg, flex_logs_compute_medium_avg, flex_logs_compute_small_avg, flex_logs_compute_xlarge_avg, flex_logs_compute_xsmall_avg, flex_logs_starter_avg, flex_logs_starter_storage_index_avg, flex_logs_starter_storage_retention_adjustment_avg, flex_stored_logs_avg, forwarding_events_bytes_sum, gcp_host_top99p, heroku_host_top99p, incident_management_monthly_active_users_hwm, incident_management_seats_hwm, indexed_events_count_sum, infra_edge_monitoring_devices_top99p, infra_host_basic_infra_basic_agent_top99p, infra_host_basic_infra_basic_vsphere_top99p, infra_host_basic_top99p, infra_host_top99p, infra_storage_mgmt_objects_count_avg, ingested_events_bytes_sum, iot_device_sum, iot_device_top99p, llm_observability_min_spend_sum, llm_observability_sum, mobile_rum_lite_session_count_sum, mobile_rum_session_count_android_sum, mobile_rum_session_count_flutter_sum, mobile_rum_session_count_ios_sum, mobile_rum_session_count_reactnative_sum, mobile_rum_session_count_roku_sum, mobile_rum_session_count_sum, mobile_rum_units_sum, ndm_netflow_events_sum, netflow_indexed_events_count_sum, network_device_wireless_top99p, network_path_sum, npm_host_top99p, observability_pipelines_bytes_processed_sum, oci_host_sum, oci_host_top99p, on_call_seat_hwm, online_archive_events_count_sum, opentelemetry_apm_host_top99p, opentelemetry_host_top99p, orgs, product_analytics_sum, profiling_aas_count_top99p, profiling_host_top99p, proxmox_host_sum, proxmox_host_top99p, published_app_hwm, rum_browser_and_mobile_session_count, rum_browser_legacy_session_count_sum, rum_browser_lite_session_count_sum, rum_browser_replay_session_count_sum, rum_indexed_sessions_sum, rum_ingested_sessions_sum, rum_lite_session_count_sum, rum_mobile_legacy_session_count_android_sum, rum_mobile_legacy_session_count_flutter_sum, rum_mobile_legacy_session_count_ios_sum, rum_mobile_legacy_session_count_reactnative_sum, rum_mobile_legacy_session_count_roku_sum, rum_mobile_lite_session_count_android_sum, rum_mobile_lite_session_count_flutter_sum, rum_mobile_lite_session_count_ios_sum, rum_mobile_lite_session_count_kotlinmultiplatform_sum, rum_mobile_lite_session_count_reactnative_sum, rum_mobile_lite_session_count_roku_sum, rum_mobile_lite_session_count_unity_sum, rum_mobile_replay_session_count_android_sum, rum_mobile_replay_session_count_ios_sum, rum_mobile_replay_session_count_kotlinmultiplatform_sum, rum_mobile_replay_session_count_reactnative_sum, rum_replay_session_count_sum, rum_session_count_sum, rum_session_replay_add_on_sum, rum_total_session_count_sum, rum_units_sum, sca_fargate_count_avg, sca_fargate_count_hwm, sds_apm_scanned_bytes_sum, sds_events_scanned_bytes_sum, sds_logs_scanned_bytes_sum, sds_rum_scanned_bytes_sum, sds_total_scanned_bytes_sum, serverless_apps_apm_apm_azure_appservice_instances_avg, serverless_apps_apm_apm_azure_azurefunction_instances_avg, serverless_apps_apm_apm_azure_containerapp_instances_avg, serverless_apps_apm_apm_fargate_ecs_tasks_avg, serverless_apps_apm_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_avg, serverless_apps_apm_excl_fargate_apm_azure_appservice_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_azurefunction_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_containerapp_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_excl_fargate_avg, serverless_apps_azure_container_app_instances_avg, serverless_apps_azure_count_avg, serverless_apps_azure_function_app_instances_avg, serverless_apps_azure_web_app_instances_avg, serverless_apps_ecs_avg, serverless_apps_eks_avg, serverless_apps_excl_fargate_avg, serverless_apps_excl_fargate_azure_container_app_instances_avg, serverless_apps_excl_fargate_azure_function_app_instances_avg, serverless_apps_excl_fargate_azure_web_app_instances_avg, serverless_apps_excl_fargate_google_cloud_functions_instances_avg, serverless_apps_excl_fargate_google_cloud_run_instances_avg, serverless_apps_excl_fargate_infra_gcp_gke_autopilot_pods_avg, serverless_apps_google_cloud_functions_instances_avg, serverless_apps_google_cloud_run_instances_avg, serverless_apps_google_count_avg, serverless_apps_infra_gcp_gke_autopilot_pods_avg, serverless_apps_total_count_avg, siem_analyzed_logs_add_on_count_sum, synthetics_browser_check_calls_count_sum, synthetics_check_calls_count_sum, synthetics_mobile_test_runs_sum, synthetics_parallel_testing_max_slots_hwm, trace_search_indexed_events_count_sum, twol_ingested_events_bytes_sum, universal_service_monitoring_host_top99p, vsphere_host_top99p, vuln_management_host_count_top99p, workflow_executions_usage_sum, additional_properties].hash + [agent_host_top99p, apm_azure_app_service_host_top99p, apm_devsecops_host_top99p, apm_enterprise_standalone_hosts_top99p, apm_fargate_count_avg, apm_host_top99p, apm_pro_standalone_hosts_top99p, appsec_fargate_count_avg, asm_serverless_sum, audit_logs_lines_indexed_sum, audit_trail_enabled_hwm, avg_profiled_fargate_tasks, aws_host_top99p, aws_lambda_func_count, aws_lambda_invocations_sum, azure_app_service_top99p, billable_ingested_bytes_sum, bits_ai_investigations_sum, browser_rum_lite_session_count_sum, browser_rum_replay_session_count_sum, browser_rum_units_sum, ccm_anthropic_spend_last, ccm_aws_spend_last, ccm_azure_spend_last, ccm_confluent_spend_last, ccm_databricks_spend_last, ccm_elastic_spend_last, ccm_fastly_spend_last, ccm_gcp_spend_last, ccm_github_spend_last, ccm_mongodb_spend_last, ccm_oci_spend_last, ccm_openai_spend_last, ccm_snowflake_spend_last, ccm_spend_monitored_ent_last, ccm_spend_monitored_pro_last, ccm_twilio_spend_last, ci_pipeline_indexed_spans_sum, ci_test_indexed_spans_sum, ci_visibility_itr_committers_hwm, ci_visibility_pipeline_committers_hwm, ci_visibility_test_committers_hwm, cloud_cost_management_aws_host_count_avg, cloud_cost_management_azure_host_count_avg, cloud_cost_management_gcp_host_count_avg, cloud_cost_management_host_count_avg, cloud_cost_management_oci_host_count_avg, cloud_siem_events_sum, code_analysis_sa_committers_hwm, code_analysis_sca_committers_hwm, code_security_host_top99p, container_avg, container_excl_agent_avg, container_hwm, csm_container_enterprise_compliance_count_sum, csm_container_enterprise_cws_count_sum, csm_container_enterprise_total_count_sum, csm_host_enterprise_aas_host_count_top99p, csm_host_enterprise_aws_host_count_top99p, csm_host_enterprise_azure_host_count_top99p, csm_host_enterprise_compliance_host_count_top99p, csm_host_enterprise_cws_host_count_top99p, csm_host_enterprise_gcp_host_count_top99p, csm_host_enterprise_oci_host_count_top99p, csm_host_enterprise_total_host_count_top99p, csm_host_pro_hosts_agentless_scanners_sum, csm_host_pro_hosts_agentless_scanners_top99p, csm_host_pro_oci_host_count_top99p, cspm_aas_host_top99p, cspm_aws_host_top99p, cspm_azure_host_top99p, cspm_container_avg, cspm_container_hwm, cspm_gcp_host_top99p, cspm_host_top99p, cspm_hosts_agentless_scanners_sum, cspm_hosts_agentless_scanners_top99p, custom_ts_avg, cws_container_count_avg, cws_fargate_task_avg, cws_host_top99p, data_jobs_monitoring_host_hr_sum, date, dbm_host_top99p, dbm_queries_count_avg, do_jobs_monitoring_orchestrators_job_hours_sum, eph_infra_host_agent_sum, eph_infra_host_alibaba_sum, eph_infra_host_aws_sum, eph_infra_host_azure_sum, eph_infra_host_basic_infra_basic_agent_sum, eph_infra_host_basic_infra_basic_vsphere_sum, eph_infra_host_basic_sum, eph_infra_host_ent_sum, eph_infra_host_gcp_sum, eph_infra_host_heroku_sum, eph_infra_host_only_aas_sum, eph_infra_host_only_vsphere_sum, eph_infra_host_opentelemetry_apm_sum, eph_infra_host_opentelemetry_sum, eph_infra_host_pro_sum, eph_infra_host_proplus_sum, eph_infra_host_proxmox_sum, error_tracking_apm_error_events_sum, error_tracking_error_events_sum, error_tracking_events_sum, error_tracking_rum_error_events_sum, event_management_correlation_correlated_events_sum, event_management_correlation_correlated_related_events_sum, event_management_correlation_sum, fargate_container_profiler_profiling_fargate_avg, fargate_container_profiler_profiling_fargate_eks_avg, fargate_tasks_count_avg, fargate_tasks_count_hwm, feature_flags_config_requests_sum, flex_logs_compute_large_avg, flex_logs_compute_medium_avg, flex_logs_compute_small_avg, flex_logs_compute_xlarge_avg, flex_logs_compute_xsmall_avg, flex_logs_starter_avg, flex_logs_starter_storage_index_avg, flex_logs_starter_storage_retention_adjustment_avg, flex_stored_logs_avg, forwarding_events_bytes_sum, gcp_host_top99p, heroku_host_top99p, incident_management_monthly_active_users_hwm, incident_management_seats_hwm, indexed_events_count_sum, infra_edge_monitoring_devices_top99p, infra_host_basic_infra_basic_agent_top99p, infra_host_basic_infra_basic_vsphere_top99p, infra_host_basic_top99p, infra_host_top99p, infra_storage_mgmt_objects_count_avg, ingested_events_bytes_sum, iot_device_sum, iot_device_top99p, llm_observability_min_spend_sum, llm_observability_sum, mobile_rum_lite_session_count_sum, mobile_rum_session_count_android_sum, mobile_rum_session_count_flutter_sum, mobile_rum_session_count_ios_sum, mobile_rum_session_count_reactnative_sum, mobile_rum_session_count_roku_sum, mobile_rum_session_count_sum, mobile_rum_units_sum, ndm_netflow_events_sum, netflow_indexed_events_count_sum, network_device_wireless_top99p, network_path_sum, npm_host_top99p, observability_pipelines_bytes_processed_sum, oci_host_sum, oci_host_top99p, on_call_seat_hwm, online_archive_events_count_sum, opentelemetry_apm_host_top99p, opentelemetry_host_top99p, orgs, product_analytics_sum, profiling_aas_count_top99p, profiling_host_top99p, proxmox_host_sum, proxmox_host_top99p, published_app_hwm, rum_browser_and_mobile_session_count, rum_browser_legacy_session_count_sum, rum_browser_lite_session_count_sum, rum_browser_replay_session_count_sum, rum_indexed_sessions_sum, rum_ingested_sessions_sum, rum_lite_session_count_sum, rum_mobile_legacy_session_count_android_sum, rum_mobile_legacy_session_count_flutter_sum, rum_mobile_legacy_session_count_ios_sum, rum_mobile_legacy_session_count_reactnative_sum, rum_mobile_legacy_session_count_roku_sum, rum_mobile_lite_session_count_android_sum, rum_mobile_lite_session_count_flutter_sum, rum_mobile_lite_session_count_ios_sum, rum_mobile_lite_session_count_kotlinmultiplatform_sum, rum_mobile_lite_session_count_reactnative_sum, rum_mobile_lite_session_count_roku_sum, rum_mobile_lite_session_count_unity_sum, rum_mobile_replay_session_count_android_sum, rum_mobile_replay_session_count_ios_sum, rum_mobile_replay_session_count_kotlinmultiplatform_sum, rum_mobile_replay_session_count_reactnative_sum, rum_replay_session_count_sum, rum_session_count_sum, rum_session_replay_add_on_sum, rum_total_session_count_sum, rum_units_sum, sca_fargate_count_avg, sca_fargate_count_hwm, sds_apm_scanned_bytes_sum, sds_events_scanned_bytes_sum, sds_logs_scanned_bytes_sum, sds_rum_scanned_bytes_sum, sds_total_scanned_bytes_sum, serverless_apps_apm_apm_azure_appservice_instances_avg, serverless_apps_apm_apm_azure_azurefunction_instances_avg, serverless_apps_apm_apm_azure_containerapp_instances_avg, serverless_apps_apm_apm_fargate_ecs_tasks_avg, serverless_apps_apm_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_avg, serverless_apps_apm_excl_fargate_apm_azure_appservice_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_azurefunction_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_containerapp_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_excl_fargate_avg, serverless_apps_azure_container_app_instances_avg, serverless_apps_azure_count_avg, serverless_apps_azure_function_app_instances_avg, serverless_apps_azure_web_app_instances_avg, serverless_apps_ecs_avg, serverless_apps_eks_avg, serverless_apps_excl_fargate_avg, serverless_apps_excl_fargate_azure_container_app_instances_avg, serverless_apps_excl_fargate_azure_function_app_instances_avg, serverless_apps_excl_fargate_azure_web_app_instances_avg, serverless_apps_excl_fargate_google_cloud_functions_instances_avg, serverless_apps_excl_fargate_google_cloud_run_instances_avg, serverless_apps_excl_fargate_infra_gcp_gke_autopilot_pods_avg, serverless_apps_google_cloud_functions_instances_avg, serverless_apps_google_cloud_run_instances_avg, serverless_apps_google_count_avg, serverless_apps_infra_gcp_gke_autopilot_pods_avg, serverless_apps_total_count_avg, siem_analyzed_logs_add_on_count_sum, synthetics_browser_check_calls_count_sum, synthetics_check_calls_count_sum, synthetics_mobile_test_runs_sum, synthetics_parallel_testing_max_slots_hwm, trace_search_indexed_events_count_sum, twol_ingested_events_bytes_sum, universal_service_monitoring_host_top99p, vsphere_host_top99p, vuln_management_host_count_top99p, workflow_executions_usage_sum, additional_properties].hash end end end diff --git a/lib/datadog_api_client/v1/models/usage_summary_date_org.rb b/lib/datadog_api_client/v1/models/usage_summary_date_org.rb index fc1e2ebf7e60..61e2cffc0fa0 100644 --- a/lib/datadog_api_client/v1/models/usage_summary_date_org.rb +++ b/lib/datadog_api_client/v1/models/usage_summary_date_org.rb @@ -285,6 +285,9 @@ class UsageSummaryDateOrg # Shows the average of all distinct Database Monitoring normalized queries over all hours in the current month for the given org. attr_accessor :dbm_queries_avg_sum + # Shows the sum of all orchestrator job hours over all hours in the current date for the given org. + attr_accessor :do_jobs_monitoring_orchestrators_job_hours_sum + # Shows the sum of all ephemeral infrastructure hosts with the Datadog Agent over all hours in the current date for the given org. attr_accessor :eph_infra_host_agent_sum @@ -871,6 +874,7 @@ def self.attribute_map :'data_jobs_monitoring_host_hr_sum' => :'data_jobs_monitoring_host_hr_sum', :'dbm_host_top99p_sum' => :'dbm_host_top99p_sum', :'dbm_queries_avg_sum' => :'dbm_queries_avg_sum', + :'do_jobs_monitoring_orchestrators_job_hours_sum' => :'do_jobs_monitoring_orchestrators_job_hours_sum', :'eph_infra_host_agent_sum' => :'eph_infra_host_agent_sum', :'eph_infra_host_alibaba_sum' => :'eph_infra_host_alibaba_sum', :'eph_infra_host_aws_sum' => :'eph_infra_host_aws_sum', @@ -1130,6 +1134,7 @@ def self.openapi_types :'data_jobs_monitoring_host_hr_sum' => :'Integer', :'dbm_host_top99p_sum' => :'Integer', :'dbm_queries_avg_sum' => :'Integer', + :'do_jobs_monitoring_orchestrators_job_hours_sum' => :'Integer', :'eph_infra_host_agent_sum' => :'Integer', :'eph_infra_host_alibaba_sum' => :'Integer', :'eph_infra_host_aws_sum' => :'Integer', @@ -1667,6 +1672,10 @@ def initialize(attributes = {}) self.dbm_queries_avg_sum = attributes[:'dbm_queries_avg_sum'] end + if attributes.key?(:'do_jobs_monitoring_orchestrators_job_hours_sum') + self.do_jobs_monitoring_orchestrators_job_hours_sum = attributes[:'do_jobs_monitoring_orchestrators_job_hours_sum'] + end + if attributes.key?(:'eph_infra_host_agent_sum') self.eph_infra_host_agent_sum = attributes[:'eph_infra_host_agent_sum'] end @@ -2438,6 +2447,7 @@ def ==(o) data_jobs_monitoring_host_hr_sum == o.data_jobs_monitoring_host_hr_sum && dbm_host_top99p_sum == o.dbm_host_top99p_sum && dbm_queries_avg_sum == o.dbm_queries_avg_sum && + do_jobs_monitoring_orchestrators_job_hours_sum == o.do_jobs_monitoring_orchestrators_job_hours_sum && eph_infra_host_agent_sum == o.eph_infra_host_agent_sum && eph_infra_host_alibaba_sum == o.eph_infra_host_alibaba_sum && eph_infra_host_aws_sum == o.eph_infra_host_aws_sum && @@ -2609,7 +2619,7 @@ def ==(o) # @return [Integer] Hash code # @!visibility private def hash - [account_name, account_public_id, agent_host_top99p, apm_azure_app_service_host_top99p, apm_devsecops_host_top99p, apm_enterprise_standalone_hosts_top99p, apm_fargate_count_avg, apm_host_top99p, apm_pro_standalone_hosts_top99p, appsec_fargate_count_avg, asm_serverless_sum, audit_logs_lines_indexed_sum, audit_trail_enabled_hwm, avg_profiled_fargate_tasks, aws_host_top99p, aws_lambda_func_count, aws_lambda_invocations_sum, azure_app_service_top99p, billable_ingested_bytes_sum, bits_ai_investigations_sum, browser_rum_lite_session_count_sum, browser_rum_replay_session_count_sum, browser_rum_units_sum, ccm_anthropic_spend_last, ccm_aws_spend_last, ccm_azure_spend_last, ccm_confluent_spend_last, ccm_databricks_spend_last, ccm_elastic_spend_last, ccm_fastly_spend_last, ccm_gcp_spend_last, ccm_github_spend_last, ccm_mongodb_spend_last, ccm_oci_spend_last, ccm_openai_spend_last, ccm_snowflake_spend_last, ccm_spend_monitored_ent_last, ccm_spend_monitored_pro_last, ccm_twilio_spend_last, ci_pipeline_indexed_spans_sum, ci_test_indexed_spans_sum, ci_visibility_itr_committers_hwm, ci_visibility_pipeline_committers_hwm, ci_visibility_test_committers_hwm, cloud_cost_management_aws_host_count_avg, cloud_cost_management_azure_host_count_avg, cloud_cost_management_gcp_host_count_avg, cloud_cost_management_host_count_avg, cloud_cost_management_oci_host_count_avg, cloud_siem_events_sum, code_analysis_sa_committers_hwm, code_analysis_sca_committers_hwm, code_security_host_top99p, container_avg, container_excl_agent_avg, container_hwm, csm_container_enterprise_compliance_count_sum, csm_container_enterprise_cws_count_sum, csm_container_enterprise_total_count_sum, csm_host_enterprise_aas_host_count_top99p, csm_host_enterprise_aws_host_count_top99p, csm_host_enterprise_azure_host_count_top99p, csm_host_enterprise_compliance_host_count_top99p, csm_host_enterprise_cws_host_count_top99p, csm_host_enterprise_gcp_host_count_top99p, csm_host_enterprise_oci_host_count_top99p, csm_host_enterprise_total_host_count_top99p, csm_host_pro_hosts_agentless_scanners_sum, csm_host_pro_hosts_agentless_scanners_top99p, csm_host_pro_oci_host_count_top99p, cspm_aas_host_top99p, cspm_aws_host_top99p, cspm_azure_host_top99p, cspm_container_avg, cspm_container_hwm, cspm_gcp_host_top99p, cspm_host_top99p, cspm_hosts_agentless_scanners_sum, cspm_hosts_agentless_scanners_top99p, custom_historical_ts_avg, custom_live_ts_avg, custom_ts_avg, cws_container_count_avg, cws_fargate_task_avg, cws_host_top99p, data_jobs_monitoring_host_hr_sum, dbm_host_top99p_sum, dbm_queries_avg_sum, eph_infra_host_agent_sum, eph_infra_host_alibaba_sum, eph_infra_host_aws_sum, eph_infra_host_azure_sum, eph_infra_host_basic_infra_basic_agent_sum, eph_infra_host_basic_infra_basic_vsphere_sum, eph_infra_host_basic_sum, eph_infra_host_ent_sum, eph_infra_host_gcp_sum, eph_infra_host_heroku_sum, eph_infra_host_only_aas_sum, eph_infra_host_only_vsphere_sum, eph_infra_host_opentelemetry_apm_sum, eph_infra_host_opentelemetry_sum, eph_infra_host_pro_sum, eph_infra_host_proplus_sum, eph_infra_host_proxmox_sum, error_tracking_apm_error_events_sum, error_tracking_error_events_sum, error_tracking_events_sum, error_tracking_rum_error_events_sum, event_management_correlation_correlated_events_sum, event_management_correlation_correlated_related_events_sum, event_management_correlation_sum, fargate_container_profiler_profiling_fargate_avg, fargate_container_profiler_profiling_fargate_eks_avg, fargate_tasks_count_avg, fargate_tasks_count_hwm, feature_flags_config_requests_sum, flex_logs_compute_large_avg, flex_logs_compute_medium_avg, flex_logs_compute_small_avg, flex_logs_compute_xlarge_avg, flex_logs_compute_xsmall_avg, flex_logs_starter_avg, flex_logs_starter_storage_index_avg, flex_logs_starter_storage_retention_adjustment_avg, flex_stored_logs_avg, forwarding_events_bytes_sum, gcp_host_top99p, heroku_host_top99p, id, incident_management_monthly_active_users_hwm, incident_management_seats_hwm, indexed_events_count_sum, infra_edge_monitoring_devices_top99p, infra_host_basic_infra_basic_agent_top99p, infra_host_basic_infra_basic_vsphere_top99p, infra_host_basic_top99p, infra_host_top99p, infra_storage_mgmt_objects_count_avg, ingested_events_bytes_sum, iot_device_agg_sum, iot_device_top99p_sum, llm_observability_min_spend_sum, llm_observability_sum, mobile_rum_lite_session_count_sum, mobile_rum_session_count_android_sum, mobile_rum_session_count_flutter_sum, mobile_rum_session_count_ios_sum, mobile_rum_session_count_reactnative_sum, mobile_rum_session_count_roku_sum, mobile_rum_session_count_sum, mobile_rum_units_sum, name, ndm_netflow_events_sum, netflow_indexed_events_count_sum, network_device_wireless_top99p, network_path_sum, npm_host_top99p, observability_pipelines_bytes_processed_sum, oci_host_sum, oci_host_top99p, on_call_seat_hwm, online_archive_events_count_sum, opentelemetry_apm_host_top99p, opentelemetry_host_top99p, product_analytics_sum, profiling_aas_count_top99p, profiling_host_top99p, proxmox_host_sum, proxmox_host_top99p, public_id, published_app_hwm, region, rum_browser_and_mobile_session_count, rum_browser_legacy_session_count_sum, rum_browser_lite_session_count_sum, rum_browser_replay_session_count_sum, rum_indexed_sessions_sum, rum_ingested_sessions_sum, rum_lite_session_count_sum, rum_mobile_legacy_session_count_android_sum, rum_mobile_legacy_session_count_flutter_sum, rum_mobile_legacy_session_count_ios_sum, rum_mobile_legacy_session_count_reactnative_sum, rum_mobile_legacy_session_count_roku_sum, rum_mobile_lite_session_count_android_sum, rum_mobile_lite_session_count_flutter_sum, rum_mobile_lite_session_count_ios_sum, rum_mobile_lite_session_count_kotlinmultiplatform_sum, rum_mobile_lite_session_count_reactnative_sum, rum_mobile_lite_session_count_roku_sum, rum_mobile_lite_session_count_unity_sum, rum_mobile_replay_session_count_android_sum, rum_mobile_replay_session_count_ios_sum, rum_mobile_replay_session_count_kotlinmultiplatform_sum, rum_mobile_replay_session_count_reactnative_sum, rum_replay_session_count_sum, rum_session_count_sum, rum_session_replay_add_on_sum, rum_total_session_count_sum, rum_units_sum, sca_fargate_count_avg, sca_fargate_count_hwm, sds_apm_scanned_bytes_sum, sds_events_scanned_bytes_sum, sds_logs_scanned_bytes_sum, sds_rum_scanned_bytes_sum, sds_total_scanned_bytes_sum, serverless_apps_apm_apm_azure_appservice_instances_avg, serverless_apps_apm_apm_azure_azurefunction_instances_avg, serverless_apps_apm_apm_azure_containerapp_instances_avg, serverless_apps_apm_apm_fargate_ecs_tasks_avg, serverless_apps_apm_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_avg, serverless_apps_apm_excl_fargate_apm_azure_appservice_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_azurefunction_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_containerapp_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_excl_fargate_avg, serverless_apps_azure_container_app_instances_avg, serverless_apps_azure_count_avg, serverless_apps_azure_function_app_instances_avg, serverless_apps_azure_web_app_instances_avg, serverless_apps_ecs_avg, serverless_apps_eks_avg, serverless_apps_excl_fargate_avg, serverless_apps_excl_fargate_azure_container_app_instances_avg, serverless_apps_excl_fargate_azure_function_app_instances_avg, serverless_apps_excl_fargate_azure_web_app_instances_avg, serverless_apps_excl_fargate_google_cloud_functions_instances_avg, serverless_apps_excl_fargate_google_cloud_run_instances_avg, serverless_apps_excl_fargate_infra_gcp_gke_autopilot_pods_avg, serverless_apps_google_cloud_functions_instances_avg, serverless_apps_google_cloud_run_instances_avg, serverless_apps_google_count_avg, serverless_apps_infra_gcp_gke_autopilot_pods_avg, serverless_apps_total_count_avg, siem_analyzed_logs_add_on_count_sum, synthetics_browser_check_calls_count_sum, synthetics_check_calls_count_sum, synthetics_mobile_test_runs_sum, synthetics_parallel_testing_max_slots_hwm, trace_search_indexed_events_count_sum, twol_ingested_events_bytes_sum, universal_service_monitoring_host_top99p, vsphere_host_top99p, vuln_management_host_count_top99p, workflow_executions_usage_sum, additional_properties].hash + [account_name, account_public_id, agent_host_top99p, apm_azure_app_service_host_top99p, apm_devsecops_host_top99p, apm_enterprise_standalone_hosts_top99p, apm_fargate_count_avg, apm_host_top99p, apm_pro_standalone_hosts_top99p, appsec_fargate_count_avg, asm_serverless_sum, audit_logs_lines_indexed_sum, audit_trail_enabled_hwm, avg_profiled_fargate_tasks, aws_host_top99p, aws_lambda_func_count, aws_lambda_invocations_sum, azure_app_service_top99p, billable_ingested_bytes_sum, bits_ai_investigations_sum, browser_rum_lite_session_count_sum, browser_rum_replay_session_count_sum, browser_rum_units_sum, ccm_anthropic_spend_last, ccm_aws_spend_last, ccm_azure_spend_last, ccm_confluent_spend_last, ccm_databricks_spend_last, ccm_elastic_spend_last, ccm_fastly_spend_last, ccm_gcp_spend_last, ccm_github_spend_last, ccm_mongodb_spend_last, ccm_oci_spend_last, ccm_openai_spend_last, ccm_snowflake_spend_last, ccm_spend_monitored_ent_last, ccm_spend_monitored_pro_last, ccm_twilio_spend_last, ci_pipeline_indexed_spans_sum, ci_test_indexed_spans_sum, ci_visibility_itr_committers_hwm, ci_visibility_pipeline_committers_hwm, ci_visibility_test_committers_hwm, cloud_cost_management_aws_host_count_avg, cloud_cost_management_azure_host_count_avg, cloud_cost_management_gcp_host_count_avg, cloud_cost_management_host_count_avg, cloud_cost_management_oci_host_count_avg, cloud_siem_events_sum, code_analysis_sa_committers_hwm, code_analysis_sca_committers_hwm, code_security_host_top99p, container_avg, container_excl_agent_avg, container_hwm, csm_container_enterprise_compliance_count_sum, csm_container_enterprise_cws_count_sum, csm_container_enterprise_total_count_sum, csm_host_enterprise_aas_host_count_top99p, csm_host_enterprise_aws_host_count_top99p, csm_host_enterprise_azure_host_count_top99p, csm_host_enterprise_compliance_host_count_top99p, csm_host_enterprise_cws_host_count_top99p, csm_host_enterprise_gcp_host_count_top99p, csm_host_enterprise_oci_host_count_top99p, csm_host_enterprise_total_host_count_top99p, csm_host_pro_hosts_agentless_scanners_sum, csm_host_pro_hosts_agentless_scanners_top99p, csm_host_pro_oci_host_count_top99p, cspm_aas_host_top99p, cspm_aws_host_top99p, cspm_azure_host_top99p, cspm_container_avg, cspm_container_hwm, cspm_gcp_host_top99p, cspm_host_top99p, cspm_hosts_agentless_scanners_sum, cspm_hosts_agentless_scanners_top99p, custom_historical_ts_avg, custom_live_ts_avg, custom_ts_avg, cws_container_count_avg, cws_fargate_task_avg, cws_host_top99p, data_jobs_monitoring_host_hr_sum, dbm_host_top99p_sum, dbm_queries_avg_sum, do_jobs_monitoring_orchestrators_job_hours_sum, eph_infra_host_agent_sum, eph_infra_host_alibaba_sum, eph_infra_host_aws_sum, eph_infra_host_azure_sum, eph_infra_host_basic_infra_basic_agent_sum, eph_infra_host_basic_infra_basic_vsphere_sum, eph_infra_host_basic_sum, eph_infra_host_ent_sum, eph_infra_host_gcp_sum, eph_infra_host_heroku_sum, eph_infra_host_only_aas_sum, eph_infra_host_only_vsphere_sum, eph_infra_host_opentelemetry_apm_sum, eph_infra_host_opentelemetry_sum, eph_infra_host_pro_sum, eph_infra_host_proplus_sum, eph_infra_host_proxmox_sum, error_tracking_apm_error_events_sum, error_tracking_error_events_sum, error_tracking_events_sum, error_tracking_rum_error_events_sum, event_management_correlation_correlated_events_sum, event_management_correlation_correlated_related_events_sum, event_management_correlation_sum, fargate_container_profiler_profiling_fargate_avg, fargate_container_profiler_profiling_fargate_eks_avg, fargate_tasks_count_avg, fargate_tasks_count_hwm, feature_flags_config_requests_sum, flex_logs_compute_large_avg, flex_logs_compute_medium_avg, flex_logs_compute_small_avg, flex_logs_compute_xlarge_avg, flex_logs_compute_xsmall_avg, flex_logs_starter_avg, flex_logs_starter_storage_index_avg, flex_logs_starter_storage_retention_adjustment_avg, flex_stored_logs_avg, forwarding_events_bytes_sum, gcp_host_top99p, heroku_host_top99p, id, incident_management_monthly_active_users_hwm, incident_management_seats_hwm, indexed_events_count_sum, infra_edge_monitoring_devices_top99p, infra_host_basic_infra_basic_agent_top99p, infra_host_basic_infra_basic_vsphere_top99p, infra_host_basic_top99p, infra_host_top99p, infra_storage_mgmt_objects_count_avg, ingested_events_bytes_sum, iot_device_agg_sum, iot_device_top99p_sum, llm_observability_min_spend_sum, llm_observability_sum, mobile_rum_lite_session_count_sum, mobile_rum_session_count_android_sum, mobile_rum_session_count_flutter_sum, mobile_rum_session_count_ios_sum, mobile_rum_session_count_reactnative_sum, mobile_rum_session_count_roku_sum, mobile_rum_session_count_sum, mobile_rum_units_sum, name, ndm_netflow_events_sum, netflow_indexed_events_count_sum, network_device_wireless_top99p, network_path_sum, npm_host_top99p, observability_pipelines_bytes_processed_sum, oci_host_sum, oci_host_top99p, on_call_seat_hwm, online_archive_events_count_sum, opentelemetry_apm_host_top99p, opentelemetry_host_top99p, product_analytics_sum, profiling_aas_count_top99p, profiling_host_top99p, proxmox_host_sum, proxmox_host_top99p, public_id, published_app_hwm, region, rum_browser_and_mobile_session_count, rum_browser_legacy_session_count_sum, rum_browser_lite_session_count_sum, rum_browser_replay_session_count_sum, rum_indexed_sessions_sum, rum_ingested_sessions_sum, rum_lite_session_count_sum, rum_mobile_legacy_session_count_android_sum, rum_mobile_legacy_session_count_flutter_sum, rum_mobile_legacy_session_count_ios_sum, rum_mobile_legacy_session_count_reactnative_sum, rum_mobile_legacy_session_count_roku_sum, rum_mobile_lite_session_count_android_sum, rum_mobile_lite_session_count_flutter_sum, rum_mobile_lite_session_count_ios_sum, rum_mobile_lite_session_count_kotlinmultiplatform_sum, rum_mobile_lite_session_count_reactnative_sum, rum_mobile_lite_session_count_roku_sum, rum_mobile_lite_session_count_unity_sum, rum_mobile_replay_session_count_android_sum, rum_mobile_replay_session_count_ios_sum, rum_mobile_replay_session_count_kotlinmultiplatform_sum, rum_mobile_replay_session_count_reactnative_sum, rum_replay_session_count_sum, rum_session_count_sum, rum_session_replay_add_on_sum, rum_total_session_count_sum, rum_units_sum, sca_fargate_count_avg, sca_fargate_count_hwm, sds_apm_scanned_bytes_sum, sds_events_scanned_bytes_sum, sds_logs_scanned_bytes_sum, sds_rum_scanned_bytes_sum, sds_total_scanned_bytes_sum, serverless_apps_apm_apm_azure_appservice_instances_avg, serverless_apps_apm_apm_azure_azurefunction_instances_avg, serverless_apps_apm_apm_azure_containerapp_instances_avg, serverless_apps_apm_apm_fargate_ecs_tasks_avg, serverless_apps_apm_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_avg, serverless_apps_apm_excl_fargate_apm_azure_appservice_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_azurefunction_instances_avg, serverless_apps_apm_excl_fargate_apm_azure_containerapp_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudfunction_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_cloudrun_instances_avg, serverless_apps_apm_excl_fargate_apm_gcp_gke_autopilot_pods_avg, serverless_apps_apm_excl_fargate_avg, serverless_apps_azure_container_app_instances_avg, serverless_apps_azure_count_avg, serverless_apps_azure_function_app_instances_avg, serverless_apps_azure_web_app_instances_avg, serverless_apps_ecs_avg, serverless_apps_eks_avg, serverless_apps_excl_fargate_avg, serverless_apps_excl_fargate_azure_container_app_instances_avg, serverless_apps_excl_fargate_azure_function_app_instances_avg, serverless_apps_excl_fargate_azure_web_app_instances_avg, serverless_apps_excl_fargate_google_cloud_functions_instances_avg, serverless_apps_excl_fargate_google_cloud_run_instances_avg, serverless_apps_excl_fargate_infra_gcp_gke_autopilot_pods_avg, serverless_apps_google_cloud_functions_instances_avg, serverless_apps_google_cloud_run_instances_avg, serverless_apps_google_count_avg, serverless_apps_infra_gcp_gke_autopilot_pods_avg, serverless_apps_total_count_avg, siem_analyzed_logs_add_on_count_sum, synthetics_browser_check_calls_count_sum, synthetics_check_calls_count_sum, synthetics_mobile_test_runs_sum, synthetics_parallel_testing_max_slots_hwm, trace_search_indexed_events_count_sum, twol_ingested_events_bytes_sum, universal_service_monitoring_host_top99p, vsphere_host_top99p, vuln_management_host_count_top99p, workflow_executions_usage_sum, additional_properties].hash end end end diff --git a/lib/datadog_api_client/v1/models/usage_summary_response.rb b/lib/datadog_api_client/v1/models/usage_summary_response.rb index 50a92eee61da..cdafee3578d6 100644 --- a/lib/datadog_api_client/v1/models/usage_summary_response.rb +++ b/lib/datadog_api_client/v1/models/usage_summary_response.rb @@ -282,6 +282,9 @@ class UsageSummaryResponse # Shows the average of all distinct Database Monitoring Normalized Queries over all hours in the current month for all organizations. attr_accessor :dbm_queries_avg_sum + # Shows the sum of all orchestrator job hours over all hours in the current month for all organizations. + attr_accessor :do_jobs_monitoring_orchestrators_job_hours_agg_sum + # Shows the last date of usage in the current month for all organizations. attr_accessor :end_date @@ -885,6 +888,7 @@ def self.attribute_map :'data_jobs_monitoring_host_hr_agg_sum' => :'data_jobs_monitoring_host_hr_agg_sum', :'dbm_host_top99p_sum' => :'dbm_host_top99p_sum', :'dbm_queries_avg_sum' => :'dbm_queries_avg_sum', + :'do_jobs_monitoring_orchestrators_job_hours_agg_sum' => :'do_jobs_monitoring_orchestrators_job_hours_agg_sum', :'end_date' => :'end_date', :'eph_infra_host_agent_agg_sum' => :'eph_infra_host_agent_agg_sum', :'eph_infra_host_alibaba_agg_sum' => :'eph_infra_host_alibaba_agg_sum', @@ -1149,6 +1153,7 @@ def self.openapi_types :'data_jobs_monitoring_host_hr_agg_sum' => :'Integer', :'dbm_host_top99p_sum' => :'Integer', :'dbm_queries_avg_sum' => :'Integer', + :'do_jobs_monitoring_orchestrators_job_hours_agg_sum' => :'Integer', :'end_date' => :'Time', :'eph_infra_host_agent_agg_sum' => :'Integer', :'eph_infra_host_alibaba_agg_sum' => :'Integer', @@ -1688,6 +1693,10 @@ def initialize(attributes = {}) self.dbm_queries_avg_sum = attributes[:'dbm_queries_avg_sum'] end + if attributes.key?(:'do_jobs_monitoring_orchestrators_job_hours_agg_sum') + self.do_jobs_monitoring_orchestrators_job_hours_agg_sum = attributes[:'do_jobs_monitoring_orchestrators_job_hours_agg_sum'] + end + if attributes.key?(:'end_date') self.end_date = attributes[:'end_date'] end @@ -2484,6 +2493,7 @@ def ==(o) data_jobs_monitoring_host_hr_agg_sum == o.data_jobs_monitoring_host_hr_agg_sum && dbm_host_top99p_sum == o.dbm_host_top99p_sum && dbm_queries_avg_sum == o.dbm_queries_avg_sum && + do_jobs_monitoring_orchestrators_job_hours_agg_sum == o.do_jobs_monitoring_orchestrators_job_hours_agg_sum && end_date == o.end_date && eph_infra_host_agent_agg_sum == o.eph_infra_host_agent_agg_sum && eph_infra_host_alibaba_agg_sum == o.eph_infra_host_alibaba_agg_sum && @@ -2661,7 +2671,7 @@ def ==(o) # @return [Integer] Hash code # @!visibility private def hash - [agent_host_top99p_sum, apm_azure_app_service_host_top99p_sum, apm_devsecops_host_top99p_sum, apm_enterprise_standalone_hosts_top99p_sum, apm_fargate_count_avg_sum, apm_host_top99p_sum, apm_pro_standalone_hosts_top99p_sum, appsec_fargate_count_avg_sum, asm_serverless_agg_sum, audit_logs_lines_indexed_agg_sum, audit_trail_enabled_hwm_sum, avg_profiled_fargate_tasks_sum, aws_host_top99p_sum, aws_lambda_func_count, aws_lambda_invocations_sum, azure_app_service_top99p_sum, azure_host_top99p_sum, billable_ingested_bytes_agg_sum, bits_ai_investigations_agg_sum, browser_rum_lite_session_count_agg_sum, browser_rum_replay_session_count_agg_sum, browser_rum_units_agg_sum, ccm_anthropic_spend_last_sum, ccm_aws_spend_last_sum, ccm_azure_spend_last_sum, ccm_confluent_spend_last_sum, ccm_databricks_spend_last_sum, ccm_elastic_spend_last_sum, ccm_fastly_spend_last_sum, ccm_gcp_spend_last_sum, ccm_github_spend_last_sum, ccm_mongodb_spend_last_sum, ccm_oci_spend_last_sum, ccm_openai_spend_last_sum, ccm_snowflake_spend_last_sum, ccm_spend_monitored_ent_last_sum, ccm_spend_monitored_pro_last_sum, ccm_twilio_spend_last_sum, ci_pipeline_indexed_spans_agg_sum, ci_test_indexed_spans_agg_sum, ci_visibility_itr_committers_hwm_sum, ci_visibility_pipeline_committers_hwm_sum, ci_visibility_test_committers_hwm_sum, cloud_cost_management_aws_host_count_avg_sum, cloud_cost_management_azure_host_count_avg_sum, cloud_cost_management_gcp_host_count_avg_sum, cloud_cost_management_host_count_avg_sum, cloud_cost_management_oci_host_count_avg_sum, cloud_siem_events_agg_sum, code_analysis_sa_committers_hwm_sum, code_analysis_sca_committers_hwm_sum, code_security_host_top99p_sum, container_avg_sum, container_excl_agent_avg_sum, container_hwm_sum, csm_container_enterprise_compliance_count_agg_sum, csm_container_enterprise_cws_count_agg_sum, csm_container_enterprise_total_count_agg_sum, csm_host_enterprise_aas_host_count_top99p_sum, csm_host_enterprise_aws_host_count_top99p_sum, csm_host_enterprise_azure_host_count_top99p_sum, csm_host_enterprise_compliance_host_count_top99p_sum, csm_host_enterprise_cws_host_count_top99p_sum, csm_host_enterprise_gcp_host_count_top99p_sum, csm_host_enterprise_oci_host_count_top99p_sum, csm_host_enterprise_total_host_count_top99p_sum, csm_host_pro_hosts_agentless_scanners_agg_sum, csm_host_pro_hosts_agentless_scanners_top99p_sum, csm_host_pro_oci_host_count_top99p_sum, cspm_aas_host_top99p_sum, cspm_aws_host_top99p_sum, cspm_azure_host_top99p_sum, cspm_container_avg_sum, cspm_container_hwm_sum, cspm_gcp_host_top99p_sum, cspm_host_top99p_sum, cspm_hosts_agentless_scanners_agg_sum, cspm_hosts_agentless_scanners_top99p_sum, custom_historical_ts_sum, custom_live_ts_sum, custom_ts_sum, cws_container_avg_sum, cws_fargate_task_avg_sum, cws_host_top99p_sum, data_jobs_monitoring_host_hr_agg_sum, dbm_host_top99p_sum, dbm_queries_avg_sum, end_date, eph_infra_host_agent_agg_sum, eph_infra_host_alibaba_agg_sum, eph_infra_host_aws_agg_sum, eph_infra_host_azure_agg_sum, eph_infra_host_basic_agg_sum, eph_infra_host_basic_infra_basic_agent_agg_sum, eph_infra_host_basic_infra_basic_vsphere_agg_sum, eph_infra_host_ent_agg_sum, eph_infra_host_gcp_agg_sum, eph_infra_host_heroku_agg_sum, eph_infra_host_only_aas_agg_sum, eph_infra_host_only_vsphere_agg_sum, eph_infra_host_opentelemetry_agg_sum, eph_infra_host_opentelemetry_apm_agg_sum, eph_infra_host_pro_agg_sum, eph_infra_host_proplus_agg_sum, eph_infra_host_proxmox_agg_sum, error_tracking_apm_error_events_agg_sum, error_tracking_error_events_agg_sum, error_tracking_events_agg_sum, error_tracking_rum_error_events_agg_sum, event_management_correlation_agg_sum, event_management_correlation_correlated_events_agg_sum, event_management_correlation_correlated_related_events_agg_sum, fargate_container_profiler_profiling_fargate_avg_sum, fargate_container_profiler_profiling_fargate_eks_avg_sum, fargate_tasks_count_avg_sum, fargate_tasks_count_hwm_sum, feature_flags_config_requests_agg_sum, flex_logs_compute_large_avg_sum, flex_logs_compute_medium_avg_sum, flex_logs_compute_small_avg_sum, flex_logs_compute_xlarge_avg_sum, flex_logs_compute_xsmall_avg_sum, flex_logs_starter_avg_sum, flex_logs_starter_storage_index_avg_sum, flex_logs_starter_storage_retention_adjustment_avg_sum, flex_stored_logs_avg_sum, forwarding_events_bytes_agg_sum, gcp_host_top99p_sum, heroku_host_top99p_sum, incident_management_monthly_active_users_hwm_sum, incident_management_seats_hwm_sum, indexed_events_count_agg_sum, infra_edge_monitoring_devices_top99p_sum, infra_host_basic_infra_basic_agent_top99p_sum, infra_host_basic_infra_basic_vsphere_top99p_sum, infra_host_basic_top99p_sum, infra_host_top99p_sum, infra_storage_mgmt_objects_count_avg_sum, ingested_events_bytes_agg_sum, iot_device_agg_sum, iot_device_top99p_sum, last_updated, live_indexed_events_agg_sum, live_ingested_bytes_agg_sum, llm_observability_agg_sum, llm_observability_min_spend_agg_sum, logs_by_retention, mobile_rum_lite_session_count_agg_sum, mobile_rum_session_count_agg_sum, mobile_rum_session_count_android_agg_sum, mobile_rum_session_count_flutter_agg_sum, mobile_rum_session_count_ios_agg_sum, mobile_rum_session_count_reactnative_agg_sum, mobile_rum_session_count_roku_agg_sum, mobile_rum_units_agg_sum, ndm_netflow_events_agg_sum, netflow_indexed_events_count_agg_sum, network_device_wireless_top99p_sum, network_path_agg_sum, npm_host_top99p_sum, observability_pipelines_bytes_processed_agg_sum, oci_host_agg_sum, oci_host_top99p_sum, on_call_seat_hwm_sum, online_archive_events_count_agg_sum, opentelemetry_apm_host_top99p_sum, opentelemetry_host_top99p_sum, product_analytics_agg_sum, profiling_aas_count_top99p_sum, profiling_container_agent_count_avg, profiling_host_count_top99p_sum, proxmox_host_agg_sum, proxmox_host_top99p_sum, published_app_hwm_sum, rehydrated_indexed_events_agg_sum, rehydrated_ingested_bytes_agg_sum, rum_browser_and_mobile_session_count, rum_browser_legacy_session_count_agg_sum, rum_browser_lite_session_count_agg_sum, rum_browser_replay_session_count_agg_sum, rum_indexed_sessions_agg_sum, rum_ingested_sessions_agg_sum, rum_lite_session_count_agg_sum, rum_mobile_legacy_session_count_android_agg_sum, rum_mobile_legacy_session_count_flutter_agg_sum, rum_mobile_legacy_session_count_ios_agg_sum, rum_mobile_legacy_session_count_reactnative_agg_sum, rum_mobile_legacy_session_count_roku_agg_sum, rum_mobile_lite_session_count_android_agg_sum, rum_mobile_lite_session_count_flutter_agg_sum, rum_mobile_lite_session_count_ios_agg_sum, rum_mobile_lite_session_count_kotlinmultiplatform_agg_sum, rum_mobile_lite_session_count_reactnative_agg_sum, rum_mobile_lite_session_count_roku_agg_sum, rum_mobile_lite_session_count_unity_agg_sum, rum_mobile_replay_session_count_android_agg_sum, rum_mobile_replay_session_count_ios_agg_sum, rum_mobile_replay_session_count_kotlinmultiplatform_agg_sum, rum_mobile_replay_session_count_reactnative_agg_sum, rum_replay_session_count_agg_sum, rum_session_count_agg_sum, rum_session_replay_add_on_agg_sum, rum_total_session_count_agg_sum, rum_units_agg_sum, sca_fargate_count_avg_sum, sca_fargate_count_hwm_sum, sds_apm_scanned_bytes_sum, sds_events_scanned_bytes_sum, sds_logs_scanned_bytes_sum, sds_rum_scanned_bytes_sum, sds_total_scanned_bytes_sum, serverless_apps_apm_apm_azure_appservice_instances_avg_sum, serverless_apps_apm_apm_azure_azurefunction_instances_avg_sum, serverless_apps_apm_apm_azure_containerapp_instances_avg_sum, serverless_apps_apm_apm_fargate_ecs_tasks_avg_sum, serverless_apps_apm_apm_gcp_cloudfunction_instances_avg_sum, serverless_apps_apm_apm_gcp_cloudrun_instances_avg_sum, serverless_apps_apm_apm_gcp_gke_autopilot_pods_avg_sum, serverless_apps_apm_avg_sum, serverless_apps_apm_excl_fargate_apm_azure_appservice_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_azure_azurefunction_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_azure_containerapp_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_gcp_cloudfunction_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_gcp_cloudrun_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_gcp_gke_autopilot_pods_avg_sum, serverless_apps_apm_excl_fargate_avg_sum, serverless_apps_azure_container_app_instances_avg_sum, serverless_apps_azure_count_avg_sum, serverless_apps_azure_function_app_instances_avg_sum, serverless_apps_azure_web_app_instances_avg_sum, serverless_apps_ecs_avg_sum, serverless_apps_eks_avg_sum, serverless_apps_excl_fargate_avg_sum, serverless_apps_excl_fargate_azure_container_app_instances_avg_sum, serverless_apps_excl_fargate_azure_function_app_instances_avg_sum, serverless_apps_excl_fargate_azure_web_app_instances_avg_sum, serverless_apps_excl_fargate_google_cloud_functions_instances_avg_sum, serverless_apps_excl_fargate_google_cloud_run_instances_avg_sum, serverless_apps_excl_fargate_infra_gcp_gke_autopilot_pods_avg_sum, serverless_apps_google_cloud_functions_instances_avg_sum, serverless_apps_google_cloud_run_instances_avg_sum, serverless_apps_google_count_avg_sum, serverless_apps_infra_gcp_gke_autopilot_pods_avg_sum, serverless_apps_total_count_avg_sum, siem_analyzed_logs_add_on_count_agg_sum, start_date, synthetics_browser_check_calls_count_agg_sum, synthetics_check_calls_count_agg_sum, synthetics_mobile_test_runs_agg_sum, synthetics_parallel_testing_max_slots_hwm_sum, trace_search_indexed_events_count_agg_sum, twol_ingested_events_bytes_agg_sum, universal_service_monitoring_host_top99p_sum, usage, vsphere_host_top99p_sum, vuln_management_host_count_top99p_sum, workflow_executions_usage_agg_sum, additional_properties].hash + [agent_host_top99p_sum, apm_azure_app_service_host_top99p_sum, apm_devsecops_host_top99p_sum, apm_enterprise_standalone_hosts_top99p_sum, apm_fargate_count_avg_sum, apm_host_top99p_sum, apm_pro_standalone_hosts_top99p_sum, appsec_fargate_count_avg_sum, asm_serverless_agg_sum, audit_logs_lines_indexed_agg_sum, audit_trail_enabled_hwm_sum, avg_profiled_fargate_tasks_sum, aws_host_top99p_sum, aws_lambda_func_count, aws_lambda_invocations_sum, azure_app_service_top99p_sum, azure_host_top99p_sum, billable_ingested_bytes_agg_sum, bits_ai_investigations_agg_sum, browser_rum_lite_session_count_agg_sum, browser_rum_replay_session_count_agg_sum, browser_rum_units_agg_sum, ccm_anthropic_spend_last_sum, ccm_aws_spend_last_sum, ccm_azure_spend_last_sum, ccm_confluent_spend_last_sum, ccm_databricks_spend_last_sum, ccm_elastic_spend_last_sum, ccm_fastly_spend_last_sum, ccm_gcp_spend_last_sum, ccm_github_spend_last_sum, ccm_mongodb_spend_last_sum, ccm_oci_spend_last_sum, ccm_openai_spend_last_sum, ccm_snowflake_spend_last_sum, ccm_spend_monitored_ent_last_sum, ccm_spend_monitored_pro_last_sum, ccm_twilio_spend_last_sum, ci_pipeline_indexed_spans_agg_sum, ci_test_indexed_spans_agg_sum, ci_visibility_itr_committers_hwm_sum, ci_visibility_pipeline_committers_hwm_sum, ci_visibility_test_committers_hwm_sum, cloud_cost_management_aws_host_count_avg_sum, cloud_cost_management_azure_host_count_avg_sum, cloud_cost_management_gcp_host_count_avg_sum, cloud_cost_management_host_count_avg_sum, cloud_cost_management_oci_host_count_avg_sum, cloud_siem_events_agg_sum, code_analysis_sa_committers_hwm_sum, code_analysis_sca_committers_hwm_sum, code_security_host_top99p_sum, container_avg_sum, container_excl_agent_avg_sum, container_hwm_sum, csm_container_enterprise_compliance_count_agg_sum, csm_container_enterprise_cws_count_agg_sum, csm_container_enterprise_total_count_agg_sum, csm_host_enterprise_aas_host_count_top99p_sum, csm_host_enterprise_aws_host_count_top99p_sum, csm_host_enterprise_azure_host_count_top99p_sum, csm_host_enterprise_compliance_host_count_top99p_sum, csm_host_enterprise_cws_host_count_top99p_sum, csm_host_enterprise_gcp_host_count_top99p_sum, csm_host_enterprise_oci_host_count_top99p_sum, csm_host_enterprise_total_host_count_top99p_sum, csm_host_pro_hosts_agentless_scanners_agg_sum, csm_host_pro_hosts_agentless_scanners_top99p_sum, csm_host_pro_oci_host_count_top99p_sum, cspm_aas_host_top99p_sum, cspm_aws_host_top99p_sum, cspm_azure_host_top99p_sum, cspm_container_avg_sum, cspm_container_hwm_sum, cspm_gcp_host_top99p_sum, cspm_host_top99p_sum, cspm_hosts_agentless_scanners_agg_sum, cspm_hosts_agentless_scanners_top99p_sum, custom_historical_ts_sum, custom_live_ts_sum, custom_ts_sum, cws_container_avg_sum, cws_fargate_task_avg_sum, cws_host_top99p_sum, data_jobs_monitoring_host_hr_agg_sum, dbm_host_top99p_sum, dbm_queries_avg_sum, do_jobs_monitoring_orchestrators_job_hours_agg_sum, end_date, eph_infra_host_agent_agg_sum, eph_infra_host_alibaba_agg_sum, eph_infra_host_aws_agg_sum, eph_infra_host_azure_agg_sum, eph_infra_host_basic_agg_sum, eph_infra_host_basic_infra_basic_agent_agg_sum, eph_infra_host_basic_infra_basic_vsphere_agg_sum, eph_infra_host_ent_agg_sum, eph_infra_host_gcp_agg_sum, eph_infra_host_heroku_agg_sum, eph_infra_host_only_aas_agg_sum, eph_infra_host_only_vsphere_agg_sum, eph_infra_host_opentelemetry_agg_sum, eph_infra_host_opentelemetry_apm_agg_sum, eph_infra_host_pro_agg_sum, eph_infra_host_proplus_agg_sum, eph_infra_host_proxmox_agg_sum, error_tracking_apm_error_events_agg_sum, error_tracking_error_events_agg_sum, error_tracking_events_agg_sum, error_tracking_rum_error_events_agg_sum, event_management_correlation_agg_sum, event_management_correlation_correlated_events_agg_sum, event_management_correlation_correlated_related_events_agg_sum, fargate_container_profiler_profiling_fargate_avg_sum, fargate_container_profiler_profiling_fargate_eks_avg_sum, fargate_tasks_count_avg_sum, fargate_tasks_count_hwm_sum, feature_flags_config_requests_agg_sum, flex_logs_compute_large_avg_sum, flex_logs_compute_medium_avg_sum, flex_logs_compute_small_avg_sum, flex_logs_compute_xlarge_avg_sum, flex_logs_compute_xsmall_avg_sum, flex_logs_starter_avg_sum, flex_logs_starter_storage_index_avg_sum, flex_logs_starter_storage_retention_adjustment_avg_sum, flex_stored_logs_avg_sum, forwarding_events_bytes_agg_sum, gcp_host_top99p_sum, heroku_host_top99p_sum, incident_management_monthly_active_users_hwm_sum, incident_management_seats_hwm_sum, indexed_events_count_agg_sum, infra_edge_monitoring_devices_top99p_sum, infra_host_basic_infra_basic_agent_top99p_sum, infra_host_basic_infra_basic_vsphere_top99p_sum, infra_host_basic_top99p_sum, infra_host_top99p_sum, infra_storage_mgmt_objects_count_avg_sum, ingested_events_bytes_agg_sum, iot_device_agg_sum, iot_device_top99p_sum, last_updated, live_indexed_events_agg_sum, live_ingested_bytes_agg_sum, llm_observability_agg_sum, llm_observability_min_spend_agg_sum, logs_by_retention, mobile_rum_lite_session_count_agg_sum, mobile_rum_session_count_agg_sum, mobile_rum_session_count_android_agg_sum, mobile_rum_session_count_flutter_agg_sum, mobile_rum_session_count_ios_agg_sum, mobile_rum_session_count_reactnative_agg_sum, mobile_rum_session_count_roku_agg_sum, mobile_rum_units_agg_sum, ndm_netflow_events_agg_sum, netflow_indexed_events_count_agg_sum, network_device_wireless_top99p_sum, network_path_agg_sum, npm_host_top99p_sum, observability_pipelines_bytes_processed_agg_sum, oci_host_agg_sum, oci_host_top99p_sum, on_call_seat_hwm_sum, online_archive_events_count_agg_sum, opentelemetry_apm_host_top99p_sum, opentelemetry_host_top99p_sum, product_analytics_agg_sum, profiling_aas_count_top99p_sum, profiling_container_agent_count_avg, profiling_host_count_top99p_sum, proxmox_host_agg_sum, proxmox_host_top99p_sum, published_app_hwm_sum, rehydrated_indexed_events_agg_sum, rehydrated_ingested_bytes_agg_sum, rum_browser_and_mobile_session_count, rum_browser_legacy_session_count_agg_sum, rum_browser_lite_session_count_agg_sum, rum_browser_replay_session_count_agg_sum, rum_indexed_sessions_agg_sum, rum_ingested_sessions_agg_sum, rum_lite_session_count_agg_sum, rum_mobile_legacy_session_count_android_agg_sum, rum_mobile_legacy_session_count_flutter_agg_sum, rum_mobile_legacy_session_count_ios_agg_sum, rum_mobile_legacy_session_count_reactnative_agg_sum, rum_mobile_legacy_session_count_roku_agg_sum, rum_mobile_lite_session_count_android_agg_sum, rum_mobile_lite_session_count_flutter_agg_sum, rum_mobile_lite_session_count_ios_agg_sum, rum_mobile_lite_session_count_kotlinmultiplatform_agg_sum, rum_mobile_lite_session_count_reactnative_agg_sum, rum_mobile_lite_session_count_roku_agg_sum, rum_mobile_lite_session_count_unity_agg_sum, rum_mobile_replay_session_count_android_agg_sum, rum_mobile_replay_session_count_ios_agg_sum, rum_mobile_replay_session_count_kotlinmultiplatform_agg_sum, rum_mobile_replay_session_count_reactnative_agg_sum, rum_replay_session_count_agg_sum, rum_session_count_agg_sum, rum_session_replay_add_on_agg_sum, rum_total_session_count_agg_sum, rum_units_agg_sum, sca_fargate_count_avg_sum, sca_fargate_count_hwm_sum, sds_apm_scanned_bytes_sum, sds_events_scanned_bytes_sum, sds_logs_scanned_bytes_sum, sds_rum_scanned_bytes_sum, sds_total_scanned_bytes_sum, serverless_apps_apm_apm_azure_appservice_instances_avg_sum, serverless_apps_apm_apm_azure_azurefunction_instances_avg_sum, serverless_apps_apm_apm_azure_containerapp_instances_avg_sum, serverless_apps_apm_apm_fargate_ecs_tasks_avg_sum, serverless_apps_apm_apm_gcp_cloudfunction_instances_avg_sum, serverless_apps_apm_apm_gcp_cloudrun_instances_avg_sum, serverless_apps_apm_apm_gcp_gke_autopilot_pods_avg_sum, serverless_apps_apm_avg_sum, serverless_apps_apm_excl_fargate_apm_azure_appservice_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_azure_azurefunction_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_azure_containerapp_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_gcp_cloudfunction_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_gcp_cloudrun_instances_avg_sum, serverless_apps_apm_excl_fargate_apm_gcp_gke_autopilot_pods_avg_sum, serverless_apps_apm_excl_fargate_avg_sum, serverless_apps_azure_container_app_instances_avg_sum, serverless_apps_azure_count_avg_sum, serverless_apps_azure_function_app_instances_avg_sum, serverless_apps_azure_web_app_instances_avg_sum, serverless_apps_ecs_avg_sum, serverless_apps_eks_avg_sum, serverless_apps_excl_fargate_avg_sum, serverless_apps_excl_fargate_azure_container_app_instances_avg_sum, serverless_apps_excl_fargate_azure_function_app_instances_avg_sum, serverless_apps_excl_fargate_azure_web_app_instances_avg_sum, serverless_apps_excl_fargate_google_cloud_functions_instances_avg_sum, serverless_apps_excl_fargate_google_cloud_run_instances_avg_sum, serverless_apps_excl_fargate_infra_gcp_gke_autopilot_pods_avg_sum, serverless_apps_google_cloud_functions_instances_avg_sum, serverless_apps_google_cloud_run_instances_avg_sum, serverless_apps_google_count_avg_sum, serverless_apps_infra_gcp_gke_autopilot_pods_avg_sum, serverless_apps_total_count_avg_sum, siem_analyzed_logs_add_on_count_agg_sum, start_date, synthetics_browser_check_calls_count_agg_sum, synthetics_check_calls_count_agg_sum, synthetics_mobile_test_runs_agg_sum, synthetics_parallel_testing_max_slots_hwm_sum, trace_search_indexed_events_count_agg_sum, twol_ingested_events_bytes_agg_sum, universal_service_monitoring_host_top99p_sum, usage, vsphere_host_top99p_sum, vuln_management_host_count_top99p_sum, workflow_executions_usage_agg_sum, additional_properties].hash end end end