@@ -76,22 +76,43 @@ func TestParseEntries(t *testing.T) {
7676 entries := parseEntries (conf )
7777 require .Len (t , entries , 3 )
7878
79- assert .Equal (t , "system " , entries [0 ].name )
79+ assert .Equal (t , "system_0 " , entries [0 ].name )
8080 assert .Equal (t , "System" , entries [0 ].channel )
8181 assert .True (t , entries [0 ].raw )
8282 assert .Equal (t , "/custom/system" , entries [0 ].logGroupName )
8383 assert .Equal (t , []string {"ERROR" }, entries [0 ].eventLevels )
8484
85- assert .Equal (t , "application " , entries [1 ].name )
85+ assert .Equal (t , "application_1 " , entries [1 ].name )
8686 assert .Equal (t , "Application" , entries [1 ].channel )
8787 assert .False (t , entries [1 ].raw )
8888 assert .Equal (t , []int {1001 }, entries [1 ].eventIDs )
8989
90- assert .Equal (t , "microsoft-windows-powershell_operational " , entries [2 ].name )
90+ assert .Equal (t , "microsoft-windows-powershell_operational_2 " , entries [2 ].name )
9191 assert .Equal (t , "Microsoft-Windows-PowerShell/Operational" , entries [2 ].channel )
9292 assert .Equal (t , []string {"WARNING" }, entries [2 ].eventLevels )
9393}
9494
95+ func TestParseEntries_ReceiverNames (t * testing.T ) {
96+ conf := confmap .NewFromStringMap (map [string ]any {
97+ "opentelemetry" : map [string ]any {
98+ "collect" : map [string ]any {
99+ "windows_events" : map [string ]any {
100+ "collect_list" : []any {
101+ map [string ]any {"event_name" : "System" , "event_levels" : []any {"ERROR" , "WARNING" , "INFORMATION" }, "log_group_name" : "/aws/cwagent/windows-events/System" },
102+ map [string ]any {"event_name" : "Application" , "event_levels" : []any {"ERROR" , "WARNING" }},
103+ },
104+ },
105+ },
106+ },
107+ })
108+ entries := parseEntries (conf )
109+ require .Len (t , entries , 2 )
110+
111+ // Receiver names are hash-based on (channel, format) and stable
112+ assert .Equal (t , "system_653521908" , entries [0 ].receiverName )
113+ assert .Equal (t , "application_2122316671" , entries [1 ].receiverName )
114+ }
115+
95116func TestParseEntries_DuplicateChannels (t * testing.T ) {
96117 conf := confmap .NewFromStringMap (map [string ]any {
97118 "opentelemetry" : map [string ]any {
@@ -108,14 +129,91 @@ func TestParseEntries_DuplicateChannels(t *testing.T) {
108129 })
109130 entries := parseEntries (conf )
110131 require .Len (t , entries , 3 )
111- assert .Equal (t , "system " , entries [0 ].name )
132+ assert .Equal (t , "system_0 " , entries [0 ].name )
112133 assert .Equal (t , "system_1" , entries [1 ].name )
113134 assert .Equal (t , "system_2" , entries [2 ].name )
114135
115- // All entries share the same receiver (same channel = same checkpoint)
116- assert .Equal (t , "system" , entries [0 ].receiverName )
117- assert .Equal (t , "system" , entries [1 ].receiverName )
118- assert .Equal (t , "system" , entries [2 ].receiverName )
136+ // All entries share the same receiver (same channel + same format = same checkpoint)
137+ assert .Equal (t , entries [0 ].receiverName , entries [1 ].receiverName )
138+ assert .Equal (t , entries [1 ].receiverName , entries [2 ].receiverName )
139+ }
140+
141+ func TestParseEntries_ReceiverNameStableAcrossReorder (t * testing.T ) {
142+ confAB := confmap .NewFromStringMap (map [string ]any {
143+ "opentelemetry" : map [string ]any {
144+ "collect" : map [string ]any {
145+ "windows_events" : map [string ]any {
146+ "collect_list" : []any {
147+ map [string ]any {"event_name" : "System" , "event_levels" : []any {"ERROR" }},
148+ map [string ]any {"event_name" : "Application" },
149+ },
150+ },
151+ },
152+ },
153+ })
154+ confBA := confmap .NewFromStringMap (map [string ]any {
155+ "opentelemetry" : map [string ]any {
156+ "collect" : map [string ]any {
157+ "windows_events" : map [string ]any {
158+ "collect_list" : []any {
159+ map [string ]any {"event_name" : "Application" },
160+ map [string ]any {"event_name" : "System" , "event_levels" : []any {"ERROR" }},
161+ },
162+ },
163+ },
164+ },
165+ })
166+
167+ entriesAB := parseEntries (confAB )
168+ entriesBA := parseEntries (confBA )
169+ require .Len (t , entriesAB , 2 )
170+ require .Len (t , entriesBA , 2 )
171+
172+ // Receiver name is order-independent (hash-based)
173+ assert .Equal (t , entriesAB [0 ].receiverName , entriesBA [1 ].receiverName )
174+ assert .Equal (t , entriesAB [1 ].receiverName , entriesBA [0 ].receiverName )
175+ }
176+
177+ func TestParseEntries_DuplicateChannelsDifferentFormat (t * testing.T ) {
178+ conf := confmap .NewFromStringMap (map [string ]any {
179+ "opentelemetry" : map [string ]any {
180+ "collect" : map [string ]any {
181+ "windows_events" : map [string ]any {
182+ "collect_list" : []any {
183+ map [string ]any {"event_name" : "System" , "event_format" : "xml" },
184+ map [string ]any {"event_name" : "System" , "event_levels" : []any {"ERROR" }},
185+ },
186+ },
187+ },
188+ },
189+ })
190+ entries := parseEntries (conf )
191+ require .Len (t , entries , 2 )
192+
193+ // Different formats get separate receivers even for the same channel
194+ assert .NotEqual (t , entries [0 ].receiverName , entries [1 ].receiverName )
195+ assert .True (t , entries [0 ].raw )
196+ assert .False (t , entries [1 ].raw )
197+ }
198+
199+ func TestParseEntries_DuplicateChannelsSameFormatShareReceiver (t * testing.T ) {
200+ conf := confmap .NewFromStringMap (map [string ]any {
201+ "opentelemetry" : map [string ]any {
202+ "collect" : map [string ]any {
203+ "windows_events" : map [string ]any {
204+ "collect_list" : []any {
205+ map [string ]any {"event_name" : "System" , "event_format" : "xml" },
206+ map [string ]any {"event_name" : "System" , "event_format" : "xml" },
207+ },
208+ },
209+ },
210+ },
211+ })
212+ entries := parseEntries (conf )
213+ require .Len (t , entries , 2 )
214+
215+ // Same format + same channel still share a receiver
216+ assert .Equal (t , entries [0 ].receiverName , entries [1 ].receiverName )
119217}
120218
121219func TestParseEntries_DifferentChannelsSanitizeCollision (t * testing.T ) {
@@ -136,6 +234,4 @@ func TestParseEntries_DifferentChannelsSanitizeCollision(t *testing.T) {
136234
137235 // Different channels get different receiver names even if they collide after sanitization
138236 assert .NotEqual (t , entries [0 ].receiverName , entries [1 ].receiverName )
139- assert .Equal (t , "a_b" , entries [0 ].receiverName )
140- assert .Equal (t , "a_b_1" , entries [1 ].receiverName )
141237}
0 commit comments