Skip to content

Commit 87ec4c7

Browse files
committed
feat(cli): add DataDog Go tracer
1 parent fc4683d commit 87ec4c7

File tree

11 files changed

+118
-2
lines changed

11 files changed

+118
-2
lines changed

cli/server.go

+1
Original file line numberDiff line numberDiff line change
@@ -2105,6 +2105,7 @@ func ConfigureTraceProvider(
21052105
sdkTracerProvider, _closeTracing, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{
21062106
Default: cfg.Trace.Enable.Value(),
21072107
Coder: shouldCoderTrace,
2108+
DataDog: cfg.Trace.DataDog.Value(),
21082109
Honeycomb: cfg.Trace.HoneycombAPIKey.String(),
21092110
})
21102111
if err != nil {

cli/testdata/server-config.yaml.golden

+3
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ introspection:
201201
# which may incur significant costs.
202202
# (default: <unset>, type: bool)
203203
captureLogs: false
204+
# Enables sending Go runtime traces to the local DataDog agent.
205+
# (default: false, type: bool)
206+
dataDog: false
204207
logging:
205208
# Output debug-level logs.
206209
# (default: <unset>, type: bool)

coderd/apidoc/docs.go

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/tracing/exporter.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"go.opentelemetry.io/otel/sdk/resource"
1414
sdktrace "go.opentelemetry.io/otel/sdk/trace"
1515
semconv "go.opentelemetry.io/otel/semconv/v1.14.0"
16+
ddotel "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentelemetry"
17+
1618
"golang.org/x/xerrors"
1719
"google.golang.org/grpc/credentials"
1820
)
@@ -24,7 +26,8 @@ type TracerOpts struct {
2426
Default bool
2527
// Coder exports traces to Coder's public tracing ingest service and is used
2628
// to improve the product. It is disabled when opting out of telemetry.
27-
Coder bool
29+
Coder bool
30+
DataDog bool
2831
// Exports traces to Honeycomb.io with the provided API key.
2932
Honeycomb string
3033
}
@@ -45,6 +48,17 @@ func TracerProvider(ctx context.Context, service string, opts TracerOpts) (*sdkt
4548
closers = []func(context.Context) error{}
4649
)
4750

51+
if opts.DataDog {
52+
// See more:
53+
// https://docs.datadoghq.com/tracing/metrics/runtime_metrics/go/
54+
dd := ddotel.NewTracerProvider()
55+
closers = append(closers, func(_ context.Context) error {
56+
// For some reason, this doesn't appear to actually wind down
57+
// the goroutines.
58+
return dd.Shutdown()
59+
})
60+
}
61+
4862
if opts.Default {
4963
exporter, err := DefaultExporter(ctx)
5064
if err != nil {

codersdk/deployment.go

+17
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ type TraceConfig struct {
310310
Enable clibase.Bool `json:"enable" typescript:",notnull"`
311311
HoneycombAPIKey clibase.String `json:"honeycomb_api_key" typescript:",notnull"`
312312
CaptureLogs clibase.Bool `json:"capture_logs" typescript:",notnull"`
313+
DataDog clibase.Bool `json:"data_dog" typescript:",notnull"`
313314
}
314315

315316
type GitAuthConfig struct {
@@ -1237,6 +1238,22 @@ when required by your organization's security policy.`,
12371238
YAML: "captureLogs",
12381239
Annotations: clibase.Annotations{}.Mark(annotationExternalProxies, "true"),
12391240
},
1241+
{
1242+
Name: "Send Go runtime traces to DataDog",
1243+
Description: "Enables sending Go runtime traces to the local DataDog agent.",
1244+
Flag: "trace-datadog",
1245+
Env: "CODER_TRACE_DATADOG",
1246+
Value: &c.Trace.DataDog,
1247+
Group: &deploymentGroupIntrospectionTracing,
1248+
YAML: "dataDog",
1249+
// Hidden until an external user asks for it. For the time being,
1250+
// it's used to detect leaks in dogfood.
1251+
Hidden: true,
1252+
// Default is false because datadog creates a bunch of goroutines that
1253+
// don't get cleaned up and trip the leak detector.
1254+
Default: "false",
1255+
Annotations: clibase.Annotations{}.Mark(annotationExternalProxies, "true"),
1256+
},
12401257
// Provisioner settings
12411258
{
12421259
Name: "Provisioner Daemons",

docs/api/general.md

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/api/schemas.md

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go.mod

+18-1
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,13 @@ require (
202202
cloud.google.com/go/longrunning v0.5.1 // indirect
203203
filippo.io/edwards25519 v1.0.0 // indirect
204204
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
205+
github.com/DataDog/appsec-internal-go v1.0.0 // indirect
206+
github.com/DataDog/datadog-agent/pkg/obfuscate v0.45.0-rc.1 // indirect
207+
github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.0-devel.0.20230725154044-2549ba9058df // indirect
208+
github.com/DataDog/datadog-go/v5 v5.1.1 // indirect
209+
github.com/DataDog/go-libddwaf v1.4.2 // indirect
210+
github.com/DataDog/go-tuf v1.0.1-0.5.2 // indirect
211+
github.com/DataDog/sketches-go v1.2.1 // indirect
205212
github.com/KyleBanks/depth v1.2.1 // indirect
206213
github.com/Microsoft/go-winio v0.6.1 // indirect
207214
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
@@ -247,6 +254,8 @@ require (
247254
github.com/docker/docker v23.0.5+incompatible // indirect
248255
github.com/docker/go-connections v0.4.0 // indirect
249256
github.com/docker/go-units v0.5.0 // indirect
257+
github.com/dustin/go-humanize v1.0.1 // indirect
258+
github.com/ebitengine/purego v0.5.0-alpha // indirect
250259
github.com/elastic/go-windows v1.0.0 // indirect
251260
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
252261
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
@@ -335,7 +344,9 @@ require (
335344
github.com/opencontainers/go-digest v1.0.0 // indirect
336345
github.com/opencontainers/image-spec v1.1.0-rc4 // indirect
337346
github.com/opencontainers/runc v1.1.5 // indirect
347+
github.com/outcaste-io/ristretto v0.2.1 // indirect
338348
github.com/pelletier/go-toml/v2 v2.0.9 // indirect
349+
github.com/philhofer/fwd v1.1.2 // indirect
339350
github.com/pierrec/lz4/v4 v4.1.17 // indirect
340351
github.com/pion/transport v0.14.1 // indirect
341352
github.com/pkg/errors v0.9.1 // indirect
@@ -344,6 +355,7 @@ require (
344355
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect
345356
github.com/rivo/uniseg v0.4.4 // indirect
346357
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b // indirect
358+
github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect
347359
github.com/sirupsen/logrus v1.9.3 // indirect
348360
github.com/spf13/cast v1.5.1 // indirect
349361
github.com/swaggo/files/v2 v2.0.0 // indirect
@@ -357,13 +369,14 @@ require (
357369
github.com/tcnksm/go-httpstat v0.2.0 // indirect
358370
github.com/tdewolff/parse/v2 v2.6.6 // indirect
359371
github.com/tdewolff/test v1.0.9 // indirect
372+
github.com/tinylib/msgp v1.1.8 // indirect
360373
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect
361374
github.com/ulikunitz/xz v0.5.11 // indirect
362375
github.com/vishvananda/netlink v1.2.1-beta.2 // indirect
363376
github.com/vishvananda/netns v0.0.4 // indirect
364377
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
365378
github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect
366-
github.com/vmihailenco/tagparser v0.1.1 // indirect
379+
github.com/vmihailenco/tagparser v0.1.2 // indirect
367380
github.com/x448/float16 v0.8.4 // indirect
368381
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
369382
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
@@ -378,15 +391,19 @@ require (
378391
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect
379392
go.opentelemetry.io/otel/metric v1.16.0 // indirect
380393
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
394+
go4.org/intern v0.0.0-20211027215823-ae77deb06f29 // indirect
381395
go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect
396+
go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 // indirect
382397
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
383398
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230215201556-9c5414ab4bde // indirect
384399
golang.zx2c4.com/wireguard/windows v0.5.3 // indirect
385400
google.golang.org/appengine v1.6.7 // indirect
386401
google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect
387402
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect
388403
google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 // indirect
404+
gopkg.in/DataDog/dd-trace-go.v1 v1.54.0 // indirect
389405
gopkg.in/yaml.v2 v2.4.0 // indirect
390406
howett.net/plist v1.0.0 // indirect
407+
inet.af/netaddr v0.0.0-20220811202034-502d2d690317 // indirect
391408
inet.af/peercred v0.0.0-20210906144145-0893ea02156a // indirect
392409
)

0 commit comments

Comments
 (0)