From 6ca8910ef2d1834c9dc1c91eb1fd940aa6b79eab Mon Sep 17 00:00:00 2001 From: Jason Hiltz-Laforge Date: Wed, 21 Jan 2026 14:55:53 -0500 Subject: [PATCH 1/2] Try simpler datagram aggregation --- lib/statsd/instrument/aggregator.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/statsd/instrument/aggregator.rb b/lib/statsd/instrument/aggregator.rb index c378e31e..c118fd59 100644 --- a/lib/statsd/instrument/aggregator.rb +++ b/lib/statsd/instrument/aggregator.rb @@ -305,14 +305,12 @@ def do_flush(aggregation_state) end def tags_sorted(tags) - return "" if tags.nil? || tags.empty? + return [] if tags.nil? || tags.empty? - if tags.is_a?(Hash) - tags = tags.sort_by { |k, _v| k.to_s }.map! { |k, v| "#{k}:#{v}" } - else - tags.sort! + unless tags.is_a?(Hash) + tags.sort end - datagram_builder(no_prefix: false).normalize_tags(tags) + #datagram_builder(no_prefix: false).normalize_tags(tags) end def packet_key(name, tags = "".b, no_prefix = false, type = COUNT, sample_rate: CONST_SAMPLE_RATE) From 2b26af4b0396283bbbf950953a0a221a14ae6fe1 Mon Sep 17 00:00:00 2001 From: Jason Hiltz-Laforge Date: Wed, 21 Jan 2026 15:34:15 -0500 Subject: [PATCH 2/2] Split tags with colon, symbolize keys --- lib/statsd/instrument/aggregator.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/statsd/instrument/aggregator.rb b/lib/statsd/instrument/aggregator.rb index c118fd59..72b4693a 100644 --- a/lib/statsd/instrument/aggregator.rb +++ b/lib/statsd/instrument/aggregator.rb @@ -152,7 +152,7 @@ def increment(name, value = 1, tags: [], no_prefix: false) return end - tags = tags_sorted(tags) + tags = tags_normalized(tags) key = packet_key(name, tags, no_prefix, COUNT) @aggregation_state_mutex.synchronize do @@ -213,7 +213,7 @@ def aggregate_timing(name, value, tags: [], no_prefix: false, type: DISTRIBUTION return end - tags = tags_sorted(tags) + tags = tags_normalized(tags) key = packet_key(name, tags, no_prefix, type, sample_rate: sample_rate) aggregation_state = nil @@ -236,7 +236,7 @@ def gauge(name, value, tags: [], no_prefix: false) return end - tags = tags_sorted(tags) + tags = tags_normalized(tags) key = packet_key(name, tags, no_prefix, GAUGE) @aggregation_state_mutex.synchronize do @@ -304,16 +304,17 @@ def do_flush(aggregation_state) end end - def tags_sorted(tags) - return [] if tags.nil? || tags.empty? + def tags_normalized(tags) + return {} if tags.nil? || tags.empty? unless tags.is_a?(Hash) - tags.sort + tags = tags.to_h { |tag| tag.include?(":") ? tag.split(":") : [tag, ""] }.transform_keys(&:to_sym) end - #datagram_builder(no_prefix: false).normalize_tags(tags) + + tags end - def packet_key(name, tags = "".b, no_prefix = false, type = COUNT, sample_rate: CONST_SAMPLE_RATE) + def packet_key(name, tags = {}, no_prefix = false, type = COUNT, sample_rate: CONST_SAMPLE_RATE) AggregationKey.new( DatagramBuilder.normalize_string(name), tags,