From ebf41c0883c54bea6334695e84f1b26292d6f80c Mon Sep 17 00:00:00 2001 From: Jesse Szwedko Date: Tue, 5 May 2026 11:41:35 -0700 Subject: [PATCH 1/3] comp/core/agenttelemetry: preserve remote_agent tag for dogstatsd bytes metrics in COAT ADP emits dogstatsd.udp_packets_bytes and dogstatsd.uds_packets_bytes as a remote agent, tagging them with remote_agent=. Without aggregate_tags, COAT strips all tags and the two sources become indistinguishable. Preserving the tag lets dashboards and queries filter by source. Co-Authored-By: Claude Sonnet 4.6 --- comp/core/agenttelemetry/impl/config.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/comp/core/agenttelemetry/impl/config.go b/comp/core/agenttelemetry/impl/config.go index 2ba67716b621..bdade84bac37 100644 --- a/comp/core/agenttelemetry/impl/config.go +++ b/comp/core/agenttelemetry/impl/config.go @@ -219,7 +219,11 @@ var defaultProfiles = ` zero_metric: true metrics: - name: dogstatsd.udp_packets_bytes + aggregate_tags: + - remote_agent - name: dogstatsd.uds_packets_bytes + aggregate_tags: + - remote_agent - name: logs.bytes_missed - name: logs.bytes_sent aggregate_tags: From fe74bddfaeab283e8d5fd90d699dcb858ba56afc Mon Sep 17 00:00:00 2001 From: Jesse Szwedko Date: Tue, 5 May 2026 12:01:20 -0700 Subject: [PATCH 2/3] comp/dogstatsd/listeners: add remote_agent label to UDP/UDS bytes counters Add remote_agent label to dogstatsd.udp_packets_bytes and dogstatsd.uds_packets_bytes following the same pattern as logs.encoded_bytes_sent. Defaults to "agent" for the core Agent. This ensures the COAT aggregate_tags filter finds the tag present rather than dropping core Agent timeseries. --- comp/dogstatsd/listeners/telemetry.go | 19 +++++++++++++++++-- comp/dogstatsd/listeners/udp.go | 2 +- comp/dogstatsd/listeners/uds_common.go | 4 ++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/comp/dogstatsd/listeners/telemetry.go b/comp/dogstatsd/listeners/telemetry.go index 25c6011243f0..858da49925f0 100644 --- a/comp/dogstatsd/listeners/telemetry.go +++ b/comp/dogstatsd/listeners/telemetry.go @@ -11,8 +11,23 @@ import ( var ( defaultListenerBuckets = []float64{300, 500, 1000, 1500, 2000, 2500, 3000, 10000, 20000, 50000} + + // agentIdentityTag holds the remote_agent tag value for this process. + // Defaults to "agent"; override via setAgentIdentity at startup. + // Mirrors the pattern in pkg/logs/metrics to avoid cross-package coupling. + agentIdentityTag = "agent" ) +// setAgentIdentity sets the remote_agent tag value for this agent process. +func setAgentIdentity(tag string) { + agentIdentityTag = tag +} + +// getAgentIdentityTag returns the remote_agent tag value for this agent process. +func getAgentIdentityTag() string { + return agentIdentityTag +} + // TelemetryStore holds all the telemetry counters and gauges for the dogstatsd listeners type TelemetryStore struct { // UDP @@ -37,13 +52,13 @@ func NewTelemetryStore(buckets []float64, telemetrycomp telemetry.Component) *Te tlmUDPPackets: telemetrycomp.NewCounter("dogstatsd", "udp_packets", []string{"state"}, "Dogstatsd UDP packets count"), tlmUDPPacketsBytes: telemetrycomp.NewCounter("dogstatsd", "udp_packets_bytes", - nil, "Dogstatsd UDP packets bytes count"), + []string{"remote_agent"}, "Dogstatsd UDP packets bytes count"), tlmUDSPackets: telemetrycomp.NewCounter("dogstatsd", "uds_packets", []string{"listener_id", "transport", "state"}, "Dogstatsd UDS packets count"), tlmUDSOriginDetectionError: telemetrycomp.NewCounter("dogstatsd", "uds_origin_detection_error", []string{"listener_id", "transport"}, "Dogstatsd UDS origin detection error count"), tlmUDSPacketsBytes: telemetrycomp.NewCounter("dogstatsd", "uds_packets_bytes", - []string{"listener_id", "transport"}, "Dogstatsd UDS packets bytes"), + []string{"remote_agent", "listener_id", "transport"}, "Dogstatsd UDS packets bytes"), tlmUDSConnections: telemetrycomp.NewGauge("dogstatsd", "uds_connections", []string{"listener_id", "transport"}, "Dogstatsd UDS connections count"), tlmListener: telemetrycomp.NewHistogram( diff --git a/comp/dogstatsd/listeners/udp.go b/comp/dogstatsd/listeners/udp.go index 39c1d9680c0b..8bc683b7a638 100644 --- a/comp/dogstatsd/listeners/udp.go +++ b/comp/dogstatsd/listeners/udp.go @@ -144,7 +144,7 @@ func (l *UDPListener) listen() { l.telemetryStore.tlmUDPPackets.Inc("ok") udpBytes.Add(int64(n)) - l.telemetryStore.tlmUDPPacketsBytes.Add(float64(n)) + l.telemetryStore.tlmUDPPacketsBytes.Add(float64(n), getAgentIdentityTag()) // packetAssembler merges multiple packets together and sends them when its buffer is full l.packetAssembler.AddMessage(l.buffer[:n]) diff --git a/comp/dogstatsd/listeners/uds_common.go b/comp/dogstatsd/listeners/uds_common.go index ad0f69016361..24190b4e4712 100644 --- a/comp/dogstatsd/listeners/uds_common.go +++ b/comp/dogstatsd/listeners/uds_common.go @@ -373,7 +373,7 @@ func (l *UDSListener) handleConnection(conn netUnixConn, closeFunc CloseFunction l.telemetryStore.tlmUDSPackets.Inc(tlmListenerID, l.transport, "ok") udsBytes.Add(int64(n)) - l.telemetryStore.tlmUDSPacketsBytes.Add(float64(n), tlmListenerID, l.transport) + l.telemetryStore.tlmUDSPacketsBytes.Add(float64(n), getAgentIdentityTag(), tlmListenerID, l.transport) packet.Contents = packet.Buffer[:n] packet.Source = packets.UDS packet.ListenerID = listenerID @@ -421,5 +421,5 @@ func (l *UDSListener) clearTelemetry(id string) { l.telemetryStore.tlmUDSConnections.Delete(id, l.transport) l.telemetryStore.tlmUDSPackets.Delete(id, l.transport, "error") l.telemetryStore.tlmUDSPackets.Delete(id, l.transport, "ok") - l.telemetryStore.tlmUDSPacketsBytes.Delete(id, l.transport) + l.telemetryStore.tlmUDSPacketsBytes.Delete(getAgentIdentityTag(), id, l.transport) } From a56fbac3b4e169293df5ebb1922b830626d87925 Mon Sep 17 00:00:00 2001 From: Jesse Szwedko Date: Tue, 5 May 2026 13:07:38 -0700 Subject: [PATCH 3/3] comp/dogstatsd/listeners: inline remote_agent value, remove unused identity functions setAgentIdentity was unused (no caller). The value is always "agent" for the core Agent, so inline it directly. Co-Authored-By: Claude Sonnet 4.6 --- comp/dogstatsd/listeners/telemetry.go | 15 --------------- comp/dogstatsd/listeners/udp.go | 2 +- comp/dogstatsd/listeners/uds_common.go | 4 ++-- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/comp/dogstatsd/listeners/telemetry.go b/comp/dogstatsd/listeners/telemetry.go index 858da49925f0..500b0be94bc7 100644 --- a/comp/dogstatsd/listeners/telemetry.go +++ b/comp/dogstatsd/listeners/telemetry.go @@ -11,23 +11,8 @@ import ( var ( defaultListenerBuckets = []float64{300, 500, 1000, 1500, 2000, 2500, 3000, 10000, 20000, 50000} - - // agentIdentityTag holds the remote_agent tag value for this process. - // Defaults to "agent"; override via setAgentIdentity at startup. - // Mirrors the pattern in pkg/logs/metrics to avoid cross-package coupling. - agentIdentityTag = "agent" ) -// setAgentIdentity sets the remote_agent tag value for this agent process. -func setAgentIdentity(tag string) { - agentIdentityTag = tag -} - -// getAgentIdentityTag returns the remote_agent tag value for this agent process. -func getAgentIdentityTag() string { - return agentIdentityTag -} - // TelemetryStore holds all the telemetry counters and gauges for the dogstatsd listeners type TelemetryStore struct { // UDP diff --git a/comp/dogstatsd/listeners/udp.go b/comp/dogstatsd/listeners/udp.go index 8bc683b7a638..b6a70881c3ea 100644 --- a/comp/dogstatsd/listeners/udp.go +++ b/comp/dogstatsd/listeners/udp.go @@ -144,7 +144,7 @@ func (l *UDPListener) listen() { l.telemetryStore.tlmUDPPackets.Inc("ok") udpBytes.Add(int64(n)) - l.telemetryStore.tlmUDPPacketsBytes.Add(float64(n), getAgentIdentityTag()) + l.telemetryStore.tlmUDPPacketsBytes.Add(float64(n), "agent") // packetAssembler merges multiple packets together and sends them when its buffer is full l.packetAssembler.AddMessage(l.buffer[:n]) diff --git a/comp/dogstatsd/listeners/uds_common.go b/comp/dogstatsd/listeners/uds_common.go index 24190b4e4712..9feef7847467 100644 --- a/comp/dogstatsd/listeners/uds_common.go +++ b/comp/dogstatsd/listeners/uds_common.go @@ -373,7 +373,7 @@ func (l *UDSListener) handleConnection(conn netUnixConn, closeFunc CloseFunction l.telemetryStore.tlmUDSPackets.Inc(tlmListenerID, l.transport, "ok") udsBytes.Add(int64(n)) - l.telemetryStore.tlmUDSPacketsBytes.Add(float64(n), getAgentIdentityTag(), tlmListenerID, l.transport) + l.telemetryStore.tlmUDSPacketsBytes.Add(float64(n), "agent", tlmListenerID, l.transport) packet.Contents = packet.Buffer[:n] packet.Source = packets.UDS packet.ListenerID = listenerID @@ -421,5 +421,5 @@ func (l *UDSListener) clearTelemetry(id string) { l.telemetryStore.tlmUDSConnections.Delete(id, l.transport) l.telemetryStore.tlmUDSPackets.Delete(id, l.transport, "error") l.telemetryStore.tlmUDSPackets.Delete(id, l.transport, "ok") - l.telemetryStore.tlmUDSPacketsBytes.Delete(getAgentIdentityTag(), id, l.transport) + l.telemetryStore.tlmUDSPacketsBytes.Delete("agent", id, l.transport) }