Skip to content

Commit 9569d8d

Browse files
authored
feat(agent-telemetry): export ADP client byte counters (#54316)
### What does this PR do? Adds the four `dogstatsd_client.*` byte-counter names to the default Agent Telemetry profile, selecting ADP’s RAR-provided counters for COAT. ### Motivation [DADP-162](https://datadoghq.atlassian.net/browse/DADP-162) requires DogStatsD client byte telemetry from both ADP and the Core Agent. The [ASUP-79 metric specification](https://datadoghq.atlassian.net/browse/ASUP-79) describes the payload contract. This profile-enrollment PR pairs with [saluki#2239](DataDog/saluki#2239) and [documentation#38659](DataDog/documentation#38659). ### Describe how you validated your changes - `dda inv test --targets=./comp/core/agenttelemetry/impl,./comp/core/remoteagentregistry/impl --timeout=120` - `dda inv linter.go --targets=./comp/core/agenttelemetry/impl,./comp/core/remoteagentregistry/impl --timeout=10` - Added a default-profile test that registers an ADP-style `dogstatsd_client__bytes_sent` counter with `emitter=agent-data-plane` and verifies that Agent Telemetry emits it. - Added a Remote Agent Registry test that parses all four ADP Prometheus counter families and verifies their counter type, values, and injected `emitter` label. ### Additional Notes The separate RAR session-aware counter-reset follow-up handles independent ADP restarts. This PR does not add direct Core Agent DogStatsD emission. [DADP-162]: https://datadoghq.atlassian.net/browse/DADP-162?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ Co-authored-by: travis.thieman <travis.thieman@datadoghq.com>
1 parent 7756fb6 commit 9569d8d

3 files changed

Lines changed: 71 additions & 0 deletions

File tree

comp/core/agenttelemetry/impl/agenttelemetry_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2815,6 +2815,28 @@ func TestDefaultAndNoDefaultPromRegistries(t *testing.T) {
28152815
assert.Equal(t, 20.0, m2.Value)
28162816
}
28172817

2818+
func TestDefaultProfilesExportRARClientByteCounters(t *testing.T) {
2819+
config := getCommonYAMLConfig(true, "")
2820+
tel := makeTelMock(t)
2821+
counter := tel.NewCounter("dogstatsd_client", "bytes_sent", []string{"emitter"}, "")
2822+
counter.Add(100, "agent-data-plane")
2823+
2824+
sender := &senderMock{}
2825+
runner := newRunnerMock()
2826+
a := getTestAtel(t, tel, config, sender, nil, runner)
2827+
require.True(t, a.enabled)
2828+
2829+
a.start()
2830+
runner.(*runnerMock).run()
2831+
2832+
require.Len(t, sender.sentMetrics, 1)
2833+
require.Equal(t, "dogstatsd_client.bytes_sent", sender.sentMetrics[0].name)
2834+
require.Len(t, sender.sentMetrics[0].metrics, 1)
2835+
metric := sender.sentMetrics[0].metrics[0]
2836+
assert.Equal(t, 100.0, metric.GetCounter().GetValue())
2837+
assert.Equal(t, map[string]string{"emitter": "agent-data-plane"}, metricLabels(metric))
2838+
}
2839+
28182840
func TestDefaultProfilesDoNotListMandatoryEmitter(t *testing.T) {
28192841
cfg, err := parseConfig(configmock.NewFromYAML(t, defaultProfiles))
28202842
require.NoError(t, err)
@@ -2838,6 +2860,10 @@ func TestDefaultProfilesDoNotListMandatoryEmitter(t *testing.T) {
28382860
}{
28392861
{name: "dogstatsd.udp_packets_bytes"},
28402862
{name: "dogstatsd.uds_packets_bytes"},
2863+
{name: "dogstatsd_client.bytes_sent"},
2864+
{name: "dogstatsd_client.bytes_dropped"},
2865+
{name: "dogstatsd_client.bytes_dropped_queue"},
2866+
{name: "dogstatsd_client.bytes_dropped_writer"},
28412867
{name: "logs.bytes_sent", aggregateTotal: true},
28422868
{name: "logs.encoded_bytes_sent", preserveTags: []string{"compression_kind"}, aggregateTotal: true},
28432869
{name: "point.sent", preserveTags: []string{"domain"}},

comp/core/agenttelemetry/impl/defaultProfiles.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ profiles:
3434
metrics:
3535
- name: dogstatsd.udp_packets_bytes
3636
- name: dogstatsd.uds_packets_bytes
37+
- name: dogstatsd_client.bytes_sent
38+
- name: dogstatsd_client.bytes_dropped
39+
- name: dogstatsd_client.bytes_dropped_queue
40+
- name: dogstatsd_client.bytes_dropped_writer
3741
- name: logs.bytes_missed
3842
- name: logs.bytes_sent
3943
aggregate_total: true

comp/core/remoteagentregistry/impl/services_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,47 @@ func TestGetTelemetry(t *testing.T) {
220220
}, protocmp.Transform()))
221221
}
222222

223+
func TestGetTelemetryCollectsADPClientByteCounters(t *testing.T) {
224+
provides, lc, _, telemetryComp, ipcComp := buildComponent(t)
225+
lc.Start(context.Background())
226+
component := provides.Comp
227+
228+
promText := `
229+
# TYPE dogstatsd_client__bytes_sent counter
230+
dogstatsd_client__bytes_sent 100
231+
# TYPE dogstatsd_client__bytes_dropped counter
232+
dogstatsd_client__bytes_dropped 7
233+
# TYPE dogstatsd_client__bytes_dropped_queue counter
234+
dogstatsd_client__bytes_dropped_queue 5
235+
# TYPE dogstatsd_client__bytes_dropped_writer counter
236+
dogstatsd_client__bytes_dropped_writer 2
237+
`
238+
_ = buildAndRegisterRemoteAgent(t, ipcComp, component, "agent-data-plane", "Agent Data Plane", "123",
239+
withTelemetryProvider(promText),
240+
)
241+
242+
metrics, err := telemetryComp.Gather(false)
243+
require.NoError(t, err)
244+
metricsByName := make(map[string]*io_prometheus_client.MetricFamily, len(metrics))
245+
for _, metric := range metrics {
246+
metricsByName[metric.GetName()] = metric
247+
}
248+
249+
for metricName, expectedValue := range map[string]float64{
250+
"dogstatsd_client__bytes_sent": 100,
251+
"dogstatsd_client__bytes_dropped": 7,
252+
"dogstatsd_client__bytes_dropped_queue": 5,
253+
"dogstatsd_client__bytes_dropped_writer": 2,
254+
} {
255+
metricFamily := metricsByName[metricName]
256+
require.NotNil(t, metricFamily, metricName)
257+
assert.Equal(t, io_prometheus_client.MetricType_COUNTER, metricFamily.GetType(), metricName)
258+
require.Len(t, metricFamily.GetMetric(), 1, metricName)
259+
assert.Equal(t, expectedValue, metricFamily.GetMetric()[0].GetCounter().GetValue(), metricName)
260+
assert.Equal(t, "agent-data-plane", metricFamily.GetMetric()[0].GetLabel()[0].GetValue(), metricName)
261+
}
262+
}
263+
223264
func TestGetTelemetryAuthoritativeEmitter(t *testing.T) {
224265
testCases := []struct {
225266
name string

0 commit comments

Comments
 (0)