Skip to content

Commit bac3783

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
Adds OpenTelemetry source support for metrics pipelines (DataDog#3759)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent dcd19a5 commit bac3783

6 files changed

Lines changed: 112 additions & 2 deletions

File tree

.generator/schemas/v2/openapi.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44821,7 +44821,7 @@ components:
4482144821
Protocol (OTLP) over gRPC and HTTP.
4482244822

4482344823

44824-
**Supported pipeline types:** logs'
44824+
**Supported pipeline types:** logs, metrics'
4482544825
properties:
4482644826
grpc_address_key:
4482744827
description: Environment variable name containing the gRPC server address
@@ -44851,6 +44851,7 @@ components:
4485144851
type: object
4485244852
x-pipeline-types:
4485344853
- logs
44854+
- metrics
4485444855
ObservabilityPipelineOpentelemetrySourceType:
4485544856
default: opentelemetry
4485644857
description: The source type. The value should always be `opentelemetry`.

api/datadogV2/model_observability_pipeline_opentelemetry_source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
// ObservabilityPipelineOpentelemetrySource The `opentelemetry` source receives telemetry data using the OpenTelemetry Protocol (OTLP) over gRPC and HTTP.
1414
//
15-
// **Supported pipeline types:** logs
15+
// **Supported pipeline types:** logs, metrics
1616
type ObservabilityPipelineOpentelemetrySource struct {
1717
// Environment variable name containing the gRPC server address for receiving OTLP data. Must be a valid environment variable name (alphanumeric characters and underscores only).
1818
GrpcAddressKey *string `json:"grpc_address_key,omitempty"`
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Validate a metrics pipeline with opentelemetry source returns "OK" response
2+
3+
package main
4+
5+
import (
6+
"context"
7+
"encoding/json"
8+
"fmt"
9+
"os"
10+
11+
"github.com/DataDog/datadog-api-client-go/v2/api/datadog"
12+
"github.com/DataDog/datadog-api-client-go/v2/api/datadogV2"
13+
)
14+
15+
func main() {
16+
body := datadogV2.ObservabilityPipelineSpec{
17+
Data: datadogV2.ObservabilityPipelineSpecData{
18+
Attributes: datadogV2.ObservabilityPipelineDataAttributes{
19+
Config: datadogV2.ObservabilityPipelineConfig{
20+
PipelineType: datadogV2.OBSERVABILITYPIPELINECONFIGPIPELINETYPE_METRICS.Ptr(),
21+
Destinations: []datadogV2.ObservabilityPipelineConfigDestinationItem{
22+
datadogV2.ObservabilityPipelineConfigDestinationItem{
23+
ObservabilityPipelineDatadogMetricsDestination: &datadogV2.ObservabilityPipelineDatadogMetricsDestination{
24+
Id: "datadog-metrics-destination",
25+
Inputs: []string{
26+
"my-processor-group",
27+
},
28+
Type: datadogV2.OBSERVABILITYPIPELINEDATADOGMETRICSDESTINATIONTYPE_DATADOG_METRICS,
29+
}},
30+
},
31+
ProcessorGroups: []datadogV2.ObservabilityPipelineConfigProcessorGroup{
32+
{
33+
Enabled: true,
34+
Id: "my-processor-group",
35+
Include: "*",
36+
Inputs: []string{
37+
"opentelemetry-source",
38+
},
39+
Processors: []datadogV2.ObservabilityPipelineConfigProcessorItem{
40+
datadogV2.ObservabilityPipelineConfigProcessorItem{
41+
ObservabilityPipelineFilterProcessor: &datadogV2.ObservabilityPipelineFilterProcessor{
42+
Enabled: true,
43+
Id: "filter-processor",
44+
Include: "env:production",
45+
Type: datadogV2.OBSERVABILITYPIPELINEFILTERPROCESSORTYPE_FILTER,
46+
}},
47+
},
48+
},
49+
},
50+
Sources: []datadogV2.ObservabilityPipelineConfigSourceItem{
51+
datadogV2.ObservabilityPipelineConfigSourceItem{
52+
ObservabilityPipelineOpentelemetrySource: &datadogV2.ObservabilityPipelineOpentelemetrySource{
53+
Id: "opentelemetry-source",
54+
Type: datadogV2.OBSERVABILITYPIPELINEOPENTELEMETRYSOURCETYPE_OPENTELEMETRY,
55+
}},
56+
},
57+
},
58+
Name: "Metrics OTel Pipeline",
59+
},
60+
Type: "pipelines",
61+
},
62+
}
63+
ctx := datadog.NewDefaultContext(context.Background())
64+
configuration := datadog.NewConfiguration()
65+
apiClient := datadog.NewAPIClient(configuration)
66+
api := datadogV2.NewObservabilityPipelinesApi(apiClient)
67+
resp, r, err := api.ValidatePipeline(ctx, body)
68+
69+
if err != nil {
70+
fmt.Fprintf(os.Stderr, "Error when calling `ObservabilityPipelinesApi.ValidatePipeline`: %v\n", err)
71+
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
72+
}
73+
74+
responseContent, _ := json.MarshalIndent(resp, "", " ")
75+
fmt.Fprintf(os.Stdout, "Response from `ObservabilityPipelinesApi.ValidatePipeline`:\n%s\n", responseContent)
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2026-03-10T16:11:47.487Z
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
interactions:
2+
- request:
3+
body: |
4+
{"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"}}
5+
form: {}
6+
headers:
7+
Accept:
8+
- application/json
9+
Content-Type:
10+
- application/json
11+
id: 0
12+
method: POST
13+
url: https://api.datadoghq.com/api/v2/obs-pipelines/pipelines/validate
14+
response:
15+
body: '{"errors":[]}
16+
17+
'
18+
code: 200
19+
duration: 0ms
20+
headers:
21+
Content-Type:
22+
- application/vnd.api+json
23+
status: 200 OK
24+
version: 2

tests/scenarios/features/v2/observability_pipelines.feature

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,14 @@ Feature: Observability Pipelines
149149
And the response "data.attributes.config.destinations" has length 1
150150
And the response "data.attributes.config.destinations[0].id" is equal to "updated-datadog-logs-destination-id"
151151

152+
@team:DataDog/observability-pipelines
153+
Scenario: Validate a metrics pipeline with opentelemetry source returns "OK" response
154+
Given new "ValidatePipeline" request
155+
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"}}
156+
When the request is sent
157+
Then the response status is 200 OK
158+
And the response "errors" has length 0
159+
152160
@team:DataDog/observability-pipelines
153161
Scenario: Validate an observability pipeline returns "Bad Request" response
154162
Given new "ValidatePipeline" request

0 commit comments

Comments
 (0)