diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml
index 50e57915664..3bec741a126 100644
--- a/.generator/schemas/v2/openapi.yaml
+++ b/.generator/schemas/v2/openapi.yaml
@@ -44821,7 +44821,7 @@ components:
Protocol (OTLP) over gRPC and HTTP.
- **Supported pipeline types:** logs'
+ **Supported pipeline types:** logs, metrics'
properties:
grpc_address_key:
description: Environment variable name containing the gRPC server address
@@ -44851,6 +44851,7 @@ components:
type: object
x-pipeline-types:
- logs
+ - metrics
ObservabilityPipelineOpentelemetrySourceType:
default: opentelemetry
description: The source type. The value should always be `opentelemetry`.
diff --git a/examples/v2/observability-pipelines/ValidatePipeline_884022323.java b/examples/v2/observability-pipelines/ValidatePipeline_884022323.java
new file mode 100644
index 00000000000..75e3efa36de
--- /dev/null
+++ b/examples/v2/observability-pipelines/ValidatePipeline_884022323.java
@@ -0,0 +1,90 @@
+// Validate a metrics pipeline with opentelemetry source returns "OK" response
+
+import com.datadog.api.client.ApiClient;
+import com.datadog.api.client.ApiException;
+import com.datadog.api.client.v2.api.ObservabilityPipelinesApi;
+import com.datadog.api.client.v2.model.ObservabilityPipelineConfig;
+import com.datadog.api.client.v2.model.ObservabilityPipelineConfigDestinationItem;
+import com.datadog.api.client.v2.model.ObservabilityPipelineConfigPipelineType;
+import com.datadog.api.client.v2.model.ObservabilityPipelineConfigProcessorGroup;
+import com.datadog.api.client.v2.model.ObservabilityPipelineConfigProcessorItem;
+import com.datadog.api.client.v2.model.ObservabilityPipelineConfigSourceItem;
+import com.datadog.api.client.v2.model.ObservabilityPipelineDataAttributes;
+import com.datadog.api.client.v2.model.ObservabilityPipelineDatadogMetricsDestination;
+import com.datadog.api.client.v2.model.ObservabilityPipelineDatadogMetricsDestinationType;
+import com.datadog.api.client.v2.model.ObservabilityPipelineFilterProcessor;
+import com.datadog.api.client.v2.model.ObservabilityPipelineFilterProcessorType;
+import com.datadog.api.client.v2.model.ObservabilityPipelineOpentelemetrySource;
+import com.datadog.api.client.v2.model.ObservabilityPipelineOpentelemetrySourceType;
+import com.datadog.api.client.v2.model.ObservabilityPipelineSpec;
+import com.datadog.api.client.v2.model.ObservabilityPipelineSpecData;
+import com.datadog.api.client.v2.model.ValidationResponse;
+import java.util.Collections;
+
+public class Example {
+ public static void main(String[] args) {
+ ApiClient defaultClient = ApiClient.getDefaultApiClient();
+ ObservabilityPipelinesApi apiInstance = new ObservabilityPipelinesApi(defaultClient);
+
+ ObservabilityPipelineSpec body =
+ new ObservabilityPipelineSpec()
+ .data(
+ new ObservabilityPipelineSpecData()
+ .attributes(
+ new ObservabilityPipelineDataAttributes()
+ .config(
+ new ObservabilityPipelineConfig()
+ .pipelineType(ObservabilityPipelineConfigPipelineType.METRICS)
+ .destinations(
+ Collections.singletonList(
+ new ObservabilityPipelineConfigDestinationItem(
+ new ObservabilityPipelineDatadogMetricsDestination()
+ .id("datadog-metrics-destination")
+ .inputs(
+ Collections.singletonList(
+ "my-processor-group"))
+ .type(
+ ObservabilityPipelineDatadogMetricsDestinationType
+ .DATADOG_METRICS))))
+ .processorGroups(
+ Collections.singletonList(
+ new ObservabilityPipelineConfigProcessorGroup()
+ .enabled(true)
+ .id("my-processor-group")
+ .include("*")
+ .inputs(
+ Collections.singletonList(
+ "opentelemetry-source"))
+ .processors(
+ Collections.singletonList(
+ new ObservabilityPipelineConfigProcessorItem(
+ new ObservabilityPipelineFilterProcessor()
+ .enabled(true)
+ .id("filter-processor")
+ .include("env:production")
+ .type(
+ ObservabilityPipelineFilterProcessorType
+ .FILTER))))))
+ .sources(
+ Collections.singletonList(
+ new ObservabilityPipelineConfigSourceItem(
+ new ObservabilityPipelineOpentelemetrySource()
+ .id("opentelemetry-source")
+ .type(
+ ObservabilityPipelineOpentelemetrySourceType
+ .OPENTELEMETRY)))))
+ .name("Metrics OTel Pipeline"))
+ .type("pipelines"));
+
+ try {
+ ValidationResponse result = apiInstance.validatePipeline(body);
+ System.out.println(result);
+ } catch (ApiException e) {
+ System.err.println("Exception when calling ObservabilityPipelinesApi#validatePipeline");
+ System.err.println("Status code: " + e.getCode());
+ System.err.println("Reason: " + e.getResponseBody());
+ System.err.println("Response headers: " + e.getResponseHeaders());
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/datadog/api/client/v2/model/ObservabilityPipelineOpentelemetrySource.java b/src/main/java/com/datadog/api/client/v2/model/ObservabilityPipelineOpentelemetrySource.java
index 2964bc439bb..221238d464d 100644
--- a/src/main/java/com/datadog/api/client/v2/model/ObservabilityPipelineOpentelemetrySource.java
+++ b/src/main/java/com/datadog/api/client/v2/model/ObservabilityPipelineOpentelemetrySource.java
@@ -21,7 +21,7 @@
* The opentelemetry source receives telemetry data using the OpenTelemetry Protocol
* (OTLP) over gRPC and HTTP.
*
- *
Supported pipeline types: logs + *
Supported pipeline types: logs, metrics */ @JsonPropertyOrder({ ObservabilityPipelineOpentelemetrySource.JSON_PROPERTY_GRPC_ADDRESS_KEY, diff --git a/src/test/resources/cassettes/features/v2/Validate_a_metrics_pipeline_with_opentelemetry_source_returns_OK_response.freeze b/src/test/resources/cassettes/features/v2/Validate_a_metrics_pipeline_with_opentelemetry_source_returns_OK_response.freeze new file mode 100644 index 00000000000..9218d08a363 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Validate_a_metrics_pipeline_with_opentelemetry_source_returns_OK_response.freeze @@ -0,0 +1 @@ +2026-03-10T16:11:47.487Z \ No newline at end of file diff --git a/src/test/resources/cassettes/features/v2/Validate_a_metrics_pipeline_with_opentelemetry_source_returns_OK_response.json b/src/test/resources/cassettes/features/v2/Validate_a_metrics_pipeline_with_opentelemetry_source_returns_OK_response.json new file mode 100644 index 00000000000..fd26d952407 --- /dev/null +++ b/src/test/resources/cassettes/features/v2/Validate_a_metrics_pipeline_with_opentelemetry_source_returns_OK_response.json @@ -0,0 +1,32 @@ +[ + { + "httpRequest": { + "body": { + "type": "JSON", + "json": "{\"data\":{\"attributes\":{\"config\":{\"destinations\":[{\"id\":\"datadog-metrics-destination\",\"inputs\":[\"my-processor-group\"],\"type\":\"datadog_metrics\"}],\"pipeline_type\":\"metrics\",\"processor_groups\":[{\"enabled\":true,\"id\":\"my-processor-group\",\"include\":\"*\",\"inputs\":[\"opentelemetry-source\"],\"processors\":[{\"enabled\":true,\"id\":\"filter-processor\",\"include\":\"env:production\",\"type\":\"filter\"}]}],\"sources\":[{\"id\":\"opentelemetry-source\",\"type\":\"opentelemetry\"}]},\"name\":\"Metrics OTel Pipeline\"},\"type\":\"pipelines\"}}" + }, + "headers": {}, + "method": "POST", + "path": "/api/v2/obs-pipelines/pipelines/validate", + "keepAlive": false, + "secure": true + }, + "httpResponse": { + "body": "{\"errors\":[]}\n", + "headers": { + "Content-Type": [ + "application/vnd.api+json" + ] + }, + "statusCode": 200, + "reasonPhrase": "OK" + }, + "times": { + "remainingTimes": 1 + }, + "timeToLive": { + "unlimited": true + }, + "id": "fd62c635-471a-b911-f21d-26a9cd87afdc" + } +] \ No newline at end of file diff --git a/src/test/resources/com/datadog/api/client/v2/api/observability_pipelines.feature b/src/test/resources/com/datadog/api/client/v2/api/observability_pipelines.feature index bf90c06c139..e272303955a 100644 --- a/src/test/resources/com/datadog/api/client/v2/api/observability_pipelines.feature +++ b/src/test/resources/com/datadog/api/client/v2/api/observability_pipelines.feature @@ -149,6 +149,14 @@ Feature: Observability Pipelines And the response "data.attributes.config.destinations" has length 1 And the response "data.attributes.config.destinations[0].id" is equal to "updated-datadog-logs-destination-id" + @team:DataDog/observability-pipelines + Scenario: Validate a metrics pipeline with opentelemetry source returns "OK" response + Given new "ValidatePipeline" request + And body with value {"data": {"attributes": {"config": {"pipeline_type": "metrics", "destinations": [{"id": "datadog-metrics-destination", "inputs": ["my-processor-group"], "type": "datadog_metrics"}], "processor_groups": [{"enabled": true, "id": "my-processor-group", "include": "*", "inputs": ["opentelemetry-source"], "processors": [{"enabled": true, "id": "filter-processor", "include": "env:production", "type": "filter"}]}], "sources": [{"id": "opentelemetry-source", "type": "opentelemetry"}]}, "name": "Metrics OTel Pipeline"}, "type": "pipelines"}} + When the request is sent + Then the response status is 200 OK + And the response "errors" has length 0 + @team:DataDog/observability-pipelines Scenario: Validate an observability pipeline returns "Bad Request" response Given new "ValidatePipeline" request