Skip to content

Commit 153bc29

Browse files
igoragoligenesor
andauthored
feat(golang): implement DD_TRACE_PROPAGATION_BEHAVIOR_EXTRACT (#6757)
Co-authored-by: genesor <benjamin.debernardi@datadoghq.com>
1 parent dd33b44 commit 153bc29

6 files changed

Lines changed: 34 additions & 9 deletions

File tree

manifests/golang.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,11 +1428,11 @@ manifest:
14281428
component_version: <=1.41.0
14291429
tests/test_identify.py::Test_Propagate: v1.48.0-rc.1
14301430
tests/test_identify.py::Test_Propagate_Legacy: v1.41.0
1431-
tests/test_library_conf.py::Test_ExtractBehavior_Default: missing_feature (baggage should be implemented and conflicting trace contexts should generate span link in v1.71.0)
1432-
tests/test_library_conf.py::Test_ExtractBehavior_Ignore: missing_feature (extract behavior not implemented)
1433-
tests/test_library_conf.py::Test_ExtractBehavior_Restart: missing_feature (extract behavior not implemented)
1431+
tests/test_library_conf.py::Test_ExtractBehavior_Default: v2.10.0-dev
1432+
tests/test_library_conf.py::Test_ExtractBehavior_Ignore: v2.10.0-dev
1433+
tests/test_library_conf.py::Test_ExtractBehavior_Restart: v2.10.0-dev
14341434
tests/test_library_conf.py::Test_ExtractBehavior_Restart_Otel: missing_feature (OTel extraction endpoint not implemented)
1435-
tests/test_library_conf.py::Test_ExtractBehavior_Restart_With_Extract_First: missing_feature (extract behavior not implemented)
1435+
tests/test_library_conf.py::Test_ExtractBehavior_Restart_With_Extract_First: v2.10.0-dev
14361436
tests/test_library_conf.py::Test_HeaderTags: v1.53.0
14371437
tests/test_library_conf.py::Test_HeaderTags_Colon_Leading: v1.53.0
14381438
tests/test_library_conf.py::Test_HeaderTags_Colon_Trailing: v1.70.0

utils/build/docker/golang/app/chi/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ func main() {
159159

160160
client := httptrace.WrapClient(http.DefaultClient)
161161
req, _ := http.NewRequestWithContext(r.Context(), http.MethodGet, url, nil)
162+
// Inject the current span's context into req.Header so headers are
163+
// visible after client.Do (the wrapped client injects into a cloned request).
164+
if span, ok := tracer.SpanFromContext(r.Context()); ok {
165+
tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header))
166+
}
162167
res, err := client.Do(req)
163168
if err != nil {
164169
logrus.Fatalln("client.Do", err)
@@ -168,7 +173,7 @@ func main() {
168173

169174
requestHeaders := make(map[string]string, len(req.Header))
170175
for key, values := range req.Header {
171-
requestHeaders[key] = strings.Join(values, ",")
176+
requestHeaders[strings.ToLower(key)] = strings.Join(values, ",")
172177
}
173178

174179
responseHeaders := make(map[string]string, len(res.Header))

utils/build/docker/golang/app/echo/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,11 @@ func main() {
174174

175175
client := httptrace.WrapClient(http.DefaultClient)
176176
req, _ := http.NewRequestWithContext(c.Request().Context(), http.MethodGet, url, nil)
177+
// Inject the current span's context into req.Header so headers are
178+
// visible after client.Do (the wrapped client injects into a cloned request).
179+
if span, ok := tracer.SpanFromContext(c.Request().Context()); ok {
180+
tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header))
181+
}
177182
res, err := client.Do(req)
178183
if err != nil {
179184
logrus.Fatalln(err)
@@ -183,7 +188,7 @@ func main() {
183188

184189
requestHeaders := make(map[string]string, len(req.Header))
185190
for key, values := range req.Header {
186-
requestHeaders[key] = strings.Join(values, ",")
191+
requestHeaders[strings.ToLower(key)] = strings.Join(values, ",")
187192
}
188193

189194
responseHeaders := make(map[string]string, len(res.Header))

utils/build/docker/golang/app/gin/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ func main() {
165165

166166
client := httptrace.WrapClient(http.DefaultClient)
167167
req, _ := http.NewRequestWithContext(ctx.Request.Context(), http.MethodGet, url, nil)
168+
// Inject the current span's context into req.Header so headers are
169+
// visible after client.Do (the wrapped client injects into a cloned request).
170+
if span, ok := tracer.SpanFromContext(ctx.Request.Context()); ok {
171+
tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header))
172+
}
168173
res, err := client.Do(req)
169174
if err != nil {
170175
logrus.Fatalln(err)
@@ -174,7 +179,7 @@ func main() {
174179

175180
requestHeaders := make(map[string]string, len(req.Header))
176181
for key, values := range req.Header {
177-
requestHeaders[key] = strings.Join(values, ",")
182+
requestHeaders[strings.ToLower(key)] = strings.Join(values, ",")
178183
}
179184

180185
responseHeaders := make(map[string]string, len(res.Header))

utils/build/docker/golang/app/net-http-orchestrion/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ func main() {
152152
}
153153

154154
req, _ := http.NewRequestWithContext(r.Context(), http.MethodGet, url, nil)
155+
// Inject the current span's context into req.Header so headers are
156+
// visible after Do (the instrumented client injects into a cloned request).
157+
if span, ok := tracer.SpanFromContext(r.Context()); ok {
158+
tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header))
159+
}
155160
res, err := http.DefaultClient.Do(req)
156161
if err != nil {
157162
log.Fatalln("client.Do", err)
@@ -161,7 +166,7 @@ func main() {
161166

162167
requestHeaders := make(map[string]string, len(req.Header))
163168
for key, values := range req.Header {
164-
requestHeaders[key] = strings.Join(values, ",")
169+
requestHeaders[strings.ToLower(key)] = strings.Join(values, ",")
165170
}
166171

167172
responseHeaders := make(map[string]string, len(res.Header))

utils/build/docker/golang/app/net-http/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,11 @@ func main() {
197197

198198
client := httptrace.WrapClient(http.DefaultClient)
199199
req, _ := http.NewRequestWithContext(r.Context(), http.MethodGet, url, nil)
200+
// Inject the current span's context into req.Header so headers are
201+
// visible after client.Do (the wrapped client injects into a cloned request).
202+
if span, ok := tracer.SpanFromContext(r.Context()); ok {
203+
tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header))
204+
}
200205
res, err := client.Do(req)
201206
if err != nil {
202207
logrus.Fatalln("client.Do", err)
@@ -206,7 +211,7 @@ func main() {
206211

207212
requestHeaders := make(map[string]string, len(req.Header))
208213
for key, values := range req.Header {
209-
requestHeaders[key] = strings.Join(values, ",")
214+
requestHeaders[strings.ToLower(key)] = strings.Join(values, ",")
210215
}
211216

212217
responseHeaders := make(map[string]string, len(res.Header))

0 commit comments

Comments
 (0)