Skip to content

Commit fd8dce8

Browse files
authored
[receiver/datadog]: follow receiver contract (#35975)
#35300 introduced a common methodology intended to be used by network receivers to follow [the contract](https://github.com/open-telemetry/opentelemetry-collector/blob/df3c9e38a80ccc3b14705462be2e2e51c628a3b3/receiver/doc.go#L10) and maintain the correct order of operations. This PR re-uses that for datadog.
1 parent e925145 commit fd8dce8

File tree

5 files changed

+89
-15
lines changed

5 files changed

+89
-15
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
7+
component: datadogreceiver
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Follow receiver contract based on type of error
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [5909]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext:
19+
20+
# Optional: The change log or logs in which this entry should be included.
21+
# e.g. '[user]' or '[user, api]'
22+
# Include 'user' if the change is relevant to end users.
23+
# Include 'api' if there is a change to a library API.
24+
# Default: '[user]'
25+
change_logs: []

receiver/datadogreceiver/go.mod

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/DataDog/datadog-agent/pkg/trace v0.58.0
1010
github.com/DataDog/datadog-api-client-go/v2 v2.31.0
1111
github.com/DataDog/sketches-go v1.4.6
12+
github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.112.0
1213
github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.112.0
1314
github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.112.0
1415
github.com/stretchr/testify v1.9.0
@@ -19,6 +20,7 @@ require (
1920
go.opentelemetry.io/collector/config/confighttp v0.112.0
2021
go.opentelemetry.io/collector/confmap v1.18.0
2122
go.opentelemetry.io/collector/consumer v0.112.0
23+
go.opentelemetry.io/collector/consumer/consumererror v0.112.0
2224
go.opentelemetry.io/collector/consumer/consumertest v0.112.0
2325
go.opentelemetry.io/collector/pdata v1.18.0
2426
go.opentelemetry.io/collector/receiver v0.112.0
@@ -72,7 +74,7 @@ require (
7274
github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect
7375
github.com/rs/cors v1.11.1 // indirect
7476
github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect
75-
github.com/shirou/gopsutil/v3 v3.24.4 // indirect
77+
github.com/shirou/gopsutil/v3 v3.24.5 // indirect
7678
github.com/shoenig/go-m1cpu v0.1.6 // indirect
7779
github.com/tklauser/go-sysconf v0.3.12 // indirect
7880
github.com/tklauser/numcpus v0.6.1 // indirect
@@ -86,7 +88,6 @@ require (
8688
go.opentelemetry.io/collector/config/configtelemetry v0.112.0 // indirect
8789
go.opentelemetry.io/collector/config/configtls v1.18.0 // indirect
8890
go.opentelemetry.io/collector/config/internal v0.112.0 // indirect
89-
go.opentelemetry.io/collector/consumer/consumererror v0.112.0 // indirect
9091
go.opentelemetry.io/collector/consumer/consumerprofiles v0.112.0 // indirect
9192
go.opentelemetry.io/collector/extension v0.112.0 // indirect
9293
go.opentelemetry.io/collector/extension/auth v0.112.0 // indirect
@@ -128,3 +129,5 @@ replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest
128129
replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden
129130

130131
replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil
132+
133+
replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal

receiver/datadogreceiver/go.sum

Lines changed: 2 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/datadogreceiver/receiver.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"go.opentelemetry.io/collector/receiver/receiverhelper"
2222
"go.uber.org/zap"
2323

24+
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/errorutil"
2425
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver/internal/translator"
2526
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/datadogreceiver/internal/translator/header"
2627
)
@@ -237,7 +238,7 @@ func (ddr *datadogReceiver) handleTraces(w http.ResponseWriter, req *http.Reques
237238
spanCount = otelTraces.SpanCount()
238239
err = ddr.nextTracesConsumer.ConsumeTraces(obsCtx, otelTraces)
239240
if err != nil {
240-
http.Error(w, "Trace consumer errored out", http.StatusInternalServerError)
241+
errorutil.HTTPError(w, err)
241242
ddr.params.Logger.Error("Trace consumer errored out", zap.Error(err))
242243
return
243244
}
@@ -277,7 +278,7 @@ func (ddr *datadogReceiver) handleV1Series(w http.ResponseWriter, req *http.Requ
277278

278279
err = ddr.nextMetricsConsumer.ConsumeMetrics(obsCtx, metrics)
279280
if err != nil {
280-
http.Error(w, err.Error(), http.StatusInternalServerError)
281+
errorutil.HTTPError(w, err)
281282
ddr.params.Logger.Error("metrics consumer errored out", zap.Error(err))
282283
return
283284
}
@@ -311,7 +312,7 @@ func (ddr *datadogReceiver) handleV2Series(w http.ResponseWriter, req *http.Requ
311312

312313
err = ddr.nextMetricsConsumer.ConsumeMetrics(obsCtx, metrics)
313314
if err != nil {
314-
http.Error(w, err.Error(), http.StatusInternalServerError)
315+
errorutil.HTTPError(w, err)
315316
ddr.params.Logger.Error("metrics consumer errored out", zap.Error(err))
316317
return
317318
}
@@ -355,7 +356,7 @@ func (ddr *datadogReceiver) handleCheckRun(w http.ResponseWriter, req *http.Requ
355356

356357
err = ddr.nextMetricsConsumer.ConsumeMetrics(obsCtx, metrics)
357358
if err != nil {
358-
http.Error(w, err.Error(), http.StatusInternalServerError)
359+
errorutil.HTTPError(w, err)
359360
ddr.params.Logger.Error("metrics consumer errored out", zap.Error(err))
360361
return
361362
}
@@ -386,7 +387,7 @@ func (ddr *datadogReceiver) handleSketches(w http.ResponseWriter, req *http.Requ
386387

387388
err = ddr.nextMetricsConsumer.ConsumeMetrics(obsCtx, metrics)
388389
if err != nil {
389-
http.Error(w, err.Error(), http.StatusInternalServerError)
390+
errorutil.HTTPError(w, err)
390391
ddr.params.Logger.Error("metrics consumer errored out", zap.Error(err))
391392
return
392393
}
@@ -455,7 +456,7 @@ func (ddr *datadogReceiver) handleStats(w http.ResponseWriter, req *http.Request
455456
err = ddr.nextMetricsConsumer.ConsumeMetrics(obsCtx, metrics)
456457
if err != nil {
457458
ddr.params.Logger.Error("Metrics consumer errored out", zap.Error(err))
458-
http.Error(w, "Metrics consumer errored out", http.StatusInternalServerError)
459+
errorutil.HTTPError(w, err)
459460
return
460461
}
461462

receiver/datadogreceiver/receiver_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/stretchr/testify/require"
2020
"go.opentelemetry.io/collector/component/componenttest"
2121
"go.opentelemetry.io/collector/consumer"
22+
"go.opentelemetry.io/collector/consumer/consumererror"
2223
"go.opentelemetry.io/collector/consumer/consumertest"
2324
"go.opentelemetry.io/collector/pdata/pcommon"
2425
"go.opentelemetry.io/collector/pdata/pmetric"
@@ -116,6 +117,55 @@ func TestDatadogServer(t *testing.T) {
116117
}
117118
}
118119

120+
func TestDatadogResponse(t *testing.T) {
121+
tests := []struct {
122+
name string
123+
err error
124+
expectedStatus int
125+
}{
126+
{
127+
name: "non-permanent error",
128+
err: errors.New("non-permanenet error"),
129+
expectedStatus: http.StatusServiceUnavailable,
130+
},
131+
{
132+
name: "permanent error",
133+
err: consumererror.NewPermanent(errors.New("non-permanenet error")),
134+
expectedStatus: http.StatusBadRequest,
135+
},
136+
}
137+
for _, tc := range tests {
138+
t.Run(tc.name, func(t *testing.T) {
139+
cfg := createDefaultConfig().(*Config)
140+
cfg.Endpoint = "localhost:0" // Using a randomly assigned address
141+
dd, err := newDataDogReceiver(
142+
cfg,
143+
receivertest.NewNopSettings(),
144+
)
145+
require.NoError(t, err, "Must not error when creating receiver")
146+
dd.(*datadogReceiver).nextTracesConsumer = consumertest.NewErr(tc.err)
147+
148+
ctx, cancel := context.WithCancel(context.Background())
149+
t.Cleanup(cancel)
150+
151+
require.NoError(t, dd.Start(ctx, componenttest.NewNopHost()))
152+
t.Cleanup(func() {
153+
require.NoError(t, dd.Shutdown(ctx), "Must not error shutting down")
154+
})
155+
156+
apiPayload := pb.TracerPayload{}
157+
var reqBytes []byte
158+
bytez, _ := apiPayload.MarshalMsg(reqBytes)
159+
req, err := http.NewRequestWithContext(ctx, http.MethodPost, fmt.Sprintf("http://%s/v0.7/traces", dd.(*datadogReceiver).address), bytes.NewReader(bytez))
160+
require.NoError(t, err, "Must not error creating request")
161+
resp, err := http.DefaultClient.Do(req)
162+
require.NoError(t, err, "Must not error performing request")
163+
require.Equal(t, tc.expectedStatus, resp.StatusCode)
164+
})
165+
}
166+
167+
}
168+
119169
func TestDatadogInfoEndpoint(t *testing.T) {
120170
for _, tc := range []struct {
121171
name string

0 commit comments

Comments
 (0)