From 3a2058905ce5af70440df371205ae3d6359e9d12 Mon Sep 17 00:00:00 2001 From: Kyle Nusbaum Date: Wed, 2 Sep 2020 17:04:38 -0500 Subject: [PATCH 1/2] ddtrace/tracer: improve agent connectivity check Previously, the tracer would attempt to send an empty http POST to the transport's endpoint at startup. This PR adds an empty msgpack array to the request body and the X-Datadog-Trace-Count header to avoid causing decoding error messages in the agent Fixes #705 --- ddtrace/tracer/log.go | 5 ++++- ddtrace/tracer/option_test.go | 10 ++++++++++ ddtrace/tracer/tracer_test.go | 6 +++++- ddtrace/tracer/transport.go | 4 ++-- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ddtrace/tracer/log.go b/ddtrace/tracer/log.go index 7e494319f0..709c4a3ed1 100644 --- a/ddtrace/tracer/log.go +++ b/ddtrace/tracer/log.go @@ -6,6 +6,7 @@ package tracer import ( + "bytes" "encoding/json" "fmt" "math" @@ -51,10 +52,12 @@ type startupInfo struct { // If the endpoint is not reachable, checkEndpoint returns an error // explaining why. func checkEndpoint(endpoint string) error { - req, err := http.NewRequest("POST", endpoint, nil) + req, err := http.NewRequest("POST", endpoint, bytes.NewReader([]byte{0x90})) if err != nil { return fmt.Errorf("cannot create http request: %v", err) } + req.Header.Set(traceCountHeader, "0") + req.Header.Set("Content-Type", "application/msgpack") _, err = defaultClient.Do(req) if err != nil { return err diff --git a/ddtrace/tracer/option_test.go b/ddtrace/tracer/option_test.go index 8f5d811f17..c0da0cc207 100644 --- a/ddtrace/tracer/option_test.go +++ b/ddtrace/tracer/option_test.go @@ -17,6 +17,16 @@ import ( "github.com/stretchr/testify/assert" ) +// withTransportSendError will cause err to be returned on any call to (transport).send() +// if the tracer is configured with a dummyTransport, +func withTransportSendError(err error) StartOption { + return func(c *config) { + if t, ok := c.transport.(*dummyTransport); ok { + t.sendError = err + } + } +} + func withTransport(t transport) StartOption { return func(c *config) { c.transport = t diff --git a/ddtrace/tracer/tracer_test.go b/ddtrace/tracer/tracer_test.go index 78faa8903c..18248b1936 100644 --- a/ddtrace/tracer/tracer_test.go +++ b/ddtrace/tracer/tracer_test.go @@ -1150,7 +1150,8 @@ func startTestTracer(t interface { // Mock Transport with a real Encoder type dummyTransport struct { sync.RWMutex - traces spanLists + traces spanLists + sendError error } func newDummyTransport() *dummyTransport { @@ -1164,6 +1165,9 @@ func (t *dummyTransport) Len() int { } func (t *dummyTransport) send(p *payload) (io.ReadCloser, error) { + if t.sendError != nil { + return nil, t.sendError + } traces, err := decode(p) if err != nil { return nil, err diff --git a/ddtrace/tracer/transport.go b/ddtrace/tracer/transport.go index 7fa506e468..ce459e6edf 100644 --- a/ddtrace/tracer/transport.go +++ b/ddtrace/tracer/transport.go @@ -58,9 +58,9 @@ type transport interface { // newTransport returns a new Transport implementation that sends traces to a // trace agent running on the given hostname and port, using a given -// http.RoundTripper. If the zero values for hostname and port are provided, +// *http.Client. If the zero values for hostname and port are provided, // the default values will be used ("localhost" for hostname, and "8126" for -// port). If roundTripper is nil, a default is used. +// port). If client is nil, a default is used. // // In general, using this method is only necessary if you have a trace agent // running on a non-default port, if it's located on another machine, or when From b27b8e100d37bf77997cf1430b044d0d2e5ed5dd Mon Sep 17 00:00:00 2001 From: Kyle Nusbaum Date: Fri, 4 Sep 2020 09:51:09 -0500 Subject: [PATCH 2/2] remove some unnecessary changes --- ddtrace/tracer/option_test.go | 10 ---------- ddtrace/tracer/tracer_test.go | 6 +----- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/ddtrace/tracer/option_test.go b/ddtrace/tracer/option_test.go index c0da0cc207..8f5d811f17 100644 --- a/ddtrace/tracer/option_test.go +++ b/ddtrace/tracer/option_test.go @@ -17,16 +17,6 @@ import ( "github.com/stretchr/testify/assert" ) -// withTransportSendError will cause err to be returned on any call to (transport).send() -// if the tracer is configured with a dummyTransport, -func withTransportSendError(err error) StartOption { - return func(c *config) { - if t, ok := c.transport.(*dummyTransport); ok { - t.sendError = err - } - } -} - func withTransport(t transport) StartOption { return func(c *config) { c.transport = t diff --git a/ddtrace/tracer/tracer_test.go b/ddtrace/tracer/tracer_test.go index 18248b1936..78faa8903c 100644 --- a/ddtrace/tracer/tracer_test.go +++ b/ddtrace/tracer/tracer_test.go @@ -1150,8 +1150,7 @@ func startTestTracer(t interface { // Mock Transport with a real Encoder type dummyTransport struct { sync.RWMutex - traces spanLists - sendError error + traces spanLists } func newDummyTransport() *dummyTransport { @@ -1165,9 +1164,6 @@ func (t *dummyTransport) Len() int { } func (t *dummyTransport) send(p *payload) (io.ReadCloser, error) { - if t.sendError != nil { - return nil, t.sendError - } traces, err := decode(p) if err != nil { return nil, err