Skip to content

Commit 6ea249a

Browse files
jszwedkoclaude
andcommitted
fix(dogstatsd-replay): delegate to agent-data-plane when ADP handles DSD
When data_plane.enabled is true, the Core Agent's DSD server is disabled and ADP owns the UDS socket. The existing dogstatsd-replay and dogstatsd-capture subcommands were unaware of this and continued to call DogstatsdSetTaggerState (a no-op for ADP) then send packets to a socket ADP owns without a replay session active, so tag enrichment was silently lost. ADP already has its own dogstatsd replay/capture CLI that correctly loads tagger state into ADP before replaying. Delegate to it via exec when data_plane.dogstatsd.enabled is true. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent fe4ab0f commit 6ea249a

3 files changed

Lines changed: 77 additions & 7 deletions

File tree

cmd/agent/subcommands/dogstatsdcapture/command.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import (
1010
"context"
1111
"fmt"
1212
"io"
13+
"os"
14+
"os/exec"
15+
"path/filepath"
1316
"time"
1417

1518
"go.uber.org/fx"
@@ -22,6 +25,7 @@ import (
2225
log "github.com/DataDog/datadog-agent/comp/core/log/def"
2326
pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup"
2427
pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/core"
28+
"github.com/DataDog/datadog-agent/pkg/util/defaultpaths"
2529
"github.com/DataDog/datadog-agent/pkg/util/fxutil"
2630

2731
"github.com/spf13/cobra"
@@ -75,7 +79,43 @@ func Commands(globalParams *command.GlobalParams) []*cobra.Command {
7579
return []*cobra.Command{dogstatsdCaptureCmd}
7680
}
7781

82+
func findADPBinary() (string, error) {
83+
candidates := []string{
84+
filepath.Join(defaultpaths.GetEmbeddedBinPath(), "agent-data-plane"),
85+
filepath.Join(defaultpaths.GetInstallPath(), "bin", "agent", "agent-data-plane"),
86+
}
87+
for _, p := range candidates {
88+
if _, err := os.Stat(p); err == nil {
89+
return p, nil
90+
}
91+
}
92+
return "", fmt.Errorf("agent-data-plane binary not found (tried: %v)", candidates)
93+
}
94+
95+
func captureViaADP(cliParams *cliParams) error {
96+
adpBin, err := findADPBinary()
97+
if err != nil {
98+
return fmt.Errorf("cannot delegate dogstatsd-capture to agent-data-plane: %w", err)
99+
}
100+
101+
args := []string{"dogstatsd", "capture", "--duration", cliParams.dsdCaptureDuration.String()}
102+
if cliParams.dsdCaptureFilePath != "" {
103+
args = append(args, "--path", cliParams.dsdCaptureFilePath)
104+
}
105+
if !cliParams.dsdCaptureCompressed {
106+
args = append(args, "--compressed", "false")
107+
}
108+
109+
cmd := exec.Command(adpBin, args...)
110+
cmd.Stdout = os.Stdout
111+
cmd.Stderr = os.Stderr
112+
return cmd.Run()
113+
}
114+
78115
func dogstatsdCapture(_ log.Component, _ config.Component, cliParams *cliParams, ipc ipc.Component) error {
116+
if pkgconfigsetup.Datadog().GetBool("data_plane.enabled") && pkgconfigsetup.Datadog().GetBool("data_plane.dogstatsd.enabled") {
117+
return captureViaADP(cliParams)
118+
}
79119
fmt.Printf("Starting a dogstatsd traffic capture session...\n\n")
80120

81121
ctx, cancel := context.WithCancel(context.Background())

cmd/agent/subcommands/dogstatsdreplay/command.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import (
1212
"fmt"
1313
"net"
1414
"os"
15+
"os/exec"
1516
"os/signal"
17+
"path/filepath"
18+
"strconv"
1619
"syscall"
1720

1821
"go.uber.org/fx"
@@ -31,6 +34,7 @@ import (
3134
replay "github.com/DataDog/datadog-agent/comp/dogstatsd/replay/impl"
3235
pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup"
3336
pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/core"
37+
"github.com/DataDog/datadog-agent/pkg/util/defaultpaths"
3438
"github.com/DataDog/datadog-agent/pkg/util/fxutil"
3539
)
3640

@@ -77,7 +81,23 @@ func Commands(globalParams *command.GlobalParams) []*cobra.Command {
7781
return []*cobra.Command{dogstatsdReplayCmd}
7882
}
7983

84+
func findADPBinary() (string, error) {
85+
candidates := []string{
86+
filepath.Join(defaultpaths.GetEmbeddedBinPath(), "agent-data-plane"),
87+
filepath.Join(defaultpaths.GetInstallPath(), "bin", "agent", "agent-data-plane"),
88+
}
89+
for _, p := range candidates {
90+
if _, err := os.Stat(p); err == nil {
91+
return p, nil
92+
}
93+
}
94+
return "", fmt.Errorf("agent-data-plane binary not found (tried: %v)", candidates)
95+
}
96+
8097
func dogstatsdReplay(_ log.Component, _ config.Component, cliParams *cliParams, ipc ipc.Component) error {
98+
if pkgconfigsetup.Datadog().GetBool("data_plane.enabled") && pkgconfigsetup.Datadog().GetBool("data_plane.dogstatsd.enabled") {
99+
return replayViaADP(cliParams)
100+
}
81101
ctx, cancel := context.WithCancel(context.Background())
82102
defer cancel()
83103

@@ -211,3 +231,20 @@ func dogstatsdReplay(_ log.Component, _ config.Component, cliParams *cliParams,
211231
fmt.Println("replay done")
212232
return err
213233
}
234+
235+
func replayViaADP(cliParams *cliParams) error {
236+
adpBin, err := findADPBinary()
237+
if err != nil {
238+
return fmt.Errorf("cannot delegate dogstatsd-replay to agent-data-plane: %w", err)
239+
}
240+
241+
args := []string{"dogstatsd", "replay", "--file", cliParams.dsdReplayFilePath}
242+
if cliParams.dsdReplayIterations != defaultIterations {
243+
args = append(args, "--loops", strconv.Itoa(cliParams.dsdReplayIterations))
244+
}
245+
246+
cmd := exec.Command(adpBin, args...)
247+
cmd.Stdout = os.Stdout
248+
cmd.Stderr = os.Stderr
249+
return cmd.Run()
250+
}

test/new-e2e/tests/agent-subcommands/dogstatsdreplay_nix_test.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ log_level: DEBUG
3030
dogstatsd_non_local_traffic: true
3131
dogstatsd_tag_cardinality: high
3232
dogstatsd_origin_detection: true
33-
# dogstatsd-replay tag enrichment relies on the Core Agent DSD server's PID map
34-
# (set via DogstatsdSetTaggerState). ADP does not consult this map for origin
35-
# detection, so replay tag enrichment does not work when ADP handles DSD.
36-
# Disable ADP here so this test exercises the Core Agent DSD path.
37-
# TODO: fix dogstatsd-replay to inject dd.internal.entity_id into packets so
38-
# it works with ADP too (https://github.com/DataDog/saluki/issues/2341).
39-
data_plane.enabled: false
4033
`),
4134
),
4235
),

0 commit comments

Comments
 (0)