@@ -250,3 +250,122 @@ func TestPromethizeTagValue(t *testing.T) {
250250 }
251251
252252}
253+
254+ func TestSplitTagValues (t * testing.T ) {
255+ tests := []struct {
256+ name string
257+ query string
258+ want map [string ]types.Tag
259+ }{
260+ {
261+ name : "simple two tags" ,
262+ query : "'env=prod','host=web1'" ,
263+ want : map [string ]types.Tag {
264+ "env" : {OP : "=" , TagValue : "prod" },
265+ "host" : {OP : "=" , TagValue : "web1" },
266+ },
267+ },
268+ {
269+ name : "comma inside quoted value" ,
270+ query : "'env=prod','desc=hello, world'" ,
271+ want : map [string ]types.Tag {
272+ "env" : {OP : "=" , TagValue : "prod" },
273+ "desc" : {OP : "=" , TagValue : "hello, world" },
274+ },
275+ },
276+ {
277+ name : "empty input" ,
278+ query : "" ,
279+ want : map [string ]types.Tag {},
280+ },
281+ {
282+ name : "single tag" ,
283+ query : "'name=cpu.load'" ,
284+ want : map [string ]types.Tag {
285+ "name" : {OP : "=" , TagValue : "cpu.load" },
286+ },
287+ },
288+ {
289+ name : "trailing comma produces empty segment (skipped)" ,
290+ query : "'env=prod'," ,
291+ want : map [string ]types.Tag {
292+ "env" : {OP : "=" , TagValue : "prod" },
293+ },
294+ },
295+ {
296+ name : "whitespace around tags" ,
297+ query : " 'env=prod' , 'host=web1' " ,
298+ want : map [string ]types.Tag {
299+ "env" : {OP : "=" , TagValue : "prod" },
300+ "host" : {OP : "=" , TagValue : "web1" },
301+ },
302+ },
303+ {
304+ name : "double-quoted values" ,
305+ query : `"env=prod","host=web1"` ,
306+ want : map [string ]types.Tag {
307+ "env" : {OP : "=" , TagValue : "prod" },
308+ "host" : {OP : "=" , TagValue : "web1" },
309+ },
310+ },
311+ }
312+
313+ for _ , tt := range tests {
314+ t .Run (tt .name , func (t * testing.T ) {
315+ got := SplitTagValues (tt .query )
316+ assert .Equal (t , tt .want , got )
317+ })
318+ }
319+ }
320+
321+ func TestSeriesByTagToPromQLWithRenames (t * testing.T ) {
322+ tests := []struct {
323+ name string
324+ step string
325+ target string
326+ renames map [string ]string
327+ wantStep string
328+ wantPromQL string
329+ }{
330+ {
331+ name : "VM: name renamed to __graphite__" ,
332+ step : "30" ,
333+ target : "seriesByTag('name=servers.web.cpu','env=prod')" ,
334+ renames : map [string ]string {"name" : "__graphite__" },
335+ wantStep : "30" ,
336+ wantPromQL : `{__graphite__="servers.web.cpu", env="prod"}` ,
337+ },
338+ {
339+ name : "VM: hostname not affected by name rename" ,
340+ step : "30" ,
341+ target : "seriesByTag('hostname=web1','env=prod')" ,
342+ renames : map [string ]string {"name" : "__graphite__" },
343+ wantStep : "30" ,
344+ wantPromQL : `{env="prod", hostname="web1"}` ,
345+ },
346+ {
347+ name : "no renames, same as SeriesByTagToPromQL" ,
348+ step : "60" ,
349+ target : "seriesByTag('__name__=~cpu.*','env=prod')" ,
350+ renames : nil ,
351+ wantStep : "60" ,
352+ wantPromQL : `{__name__=~"cpu.*", env="prod"}` ,
353+ },
354+ {
355+ name : "rename collision: existing tag overwritten" ,
356+ step : "30" ,
357+ target : "seriesByTag('name=metric.path','__graphite__=old')" ,
358+ renames : map [string ]string {"name" : "__graphite__" },
359+ wantStep : "30" ,
360+ wantPromQL : `{__graphite__="metric.path"}` ,
361+ },
362+ }
363+
364+ for _ , tt := range tests {
365+ t .Run (tt .name , func (t * testing.T ) {
366+ gotStep , gotPromQL := SeriesByTagToPromQLWithRenames (tt .step , tt .target , tt .renames )
367+ assert .Equal (t , tt .wantStep , gotStep )
368+ assert .Equal (t , tt .wantPromQL , gotPromQL )
369+ })
370+ }
371+ }
0 commit comments