Skip to content

Commit

Permalink
fixup! Add support for metadata (non-indexable tags) in the CSV output
Browse files Browse the repository at this point in the history
  • Loading branch information
codebien committed Oct 17, 2022
1 parent 18b9749 commit 42db878
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 19 deletions.
15 changes: 9 additions & 6 deletions output/csv/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func newOutput(params output.Params) (*Output, error) {
resTags: resTags,
ignoredTags: ignoredTags,
csvWriter: stdoutWriter,
row: make([]string, 3+len(resTags)+1),
row: make([]string, 3+len(resTags)+2),
saveInterval: saveInterval,
timeFormat: timeFormat,
closeFn: func() error { return nil },
Expand All @@ -99,7 +99,7 @@ func newOutput(params output.Params) (*Output, error) {
fname: fname,
resTags: resTags,
ignoredTags: ignoredTags,
row: make([]string, 3+len(resTags)+1),
row: make([]string, 3+len(resTags)+2),
saveInterval: saveInterval,
timeFormat: timeFormat,
logger: logger,
Expand Down Expand Up @@ -184,6 +184,7 @@ func (o *Output) flushMetrics() {
// MakeHeader creates list of column names for csv file
func MakeHeader(tags []string) []string {
tags = append(tags, "extra_tags")
tags = append(tags, "metadata")
return append([]string{"metric_name", "timestamp", "metric_value"}, tags...)
}

Expand Down Expand Up @@ -240,14 +241,16 @@ func SampleToRow(sample *metrics.Sample, resTags []string, ignoredTags []string,
break
}
}
for tag, val := range sample.Metadata {
if !writeTag(tag, val) {
row[len(row)-2] = extraTags.String()
extraTags.Reset()
prev = false

for key, val := range sample.Metadata {
if !writeTag(key, val) {
break
}
}

row[len(row)-1] = extraTags.String()

return row
}

Expand Down
29 changes: 16 additions & 13 deletions output/csv/output_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,12 @@ func TestMakeHeader(t *testing.T) {
testname, tags := testname, tags
t.Run(testname, func(t *testing.T) {
header := MakeHeader(tags)
assert.Equal(t, len(tags)+4, len(header))
assert.Equal(t, len(tags)+5, len(header))
assert.Equal(t, "metric_name", header[0])
assert.Equal(t, "timestamp", header[1])
assert.Equal(t, "metric_value", header[2])
assert.Equal(t, "extra_tags", header[len(header)-1])
assert.Equal(t, "extra_tags", header[len(header)-2])
assert.Equal(t, "metadata", header[len(header)-1])
})
}
}
Expand Down Expand Up @@ -169,12 +170,12 @@ func TestSampleToRow(t *testing.T) {
expectedRow := expected[i]

t.Run(testname, func(t *testing.T) {
row := SampleToRow(sample, resTags, ignoredTags, make([]string, 3+len(resTags)+1), timeFormat)
row := SampleToRow(sample, resTags, ignoredTags, make([]string, 3+len(resTags)+2), timeFormat)
for ind, cell := range expectedRow.baseRow {
assert.Equal(t, cell, row[ind])
}
for _, cell := range expectedRow.extraRow {
assert.Contains(t, row[len(row)-1], cell)
assert.Contains(t, row[len(row)-2], cell)
}
})
}
Expand Down Expand Up @@ -254,7 +255,9 @@ func TestRun(t *testing.T) {
fileName: "test",
fileReaderFunc: readUnCompressedFile,
timeFormat: "",
outputContent: "metric_name,timestamp,metric_value,check,error,extra_tags\n" + "my_metric,1562324643,1.000000,val1,val3,url=val2\n" + "my_metric,1562324644,1.000000,val1,val3,tag4=val4&url=val2\n",
outputContent: "metric_name,timestamp,metric_value,check,error,extra_tags,metadata\n" +
"my_metric,1562324643,1.000000,val1,val3,url=val2,\n" +
"my_metric,1562324644,1.000000,val1,val3,tag4=val4&url=val2,\n",
},
{
samples: []metrics.SampleContainer{
Expand Down Expand Up @@ -288,9 +291,9 @@ func TestRun(t *testing.T) {
fileName: "test.gz",
fileReaderFunc: readCompressedFile,
timeFormat: "unix",
outputContent: "metric_name,timestamp,metric_value,check,error,extra_tags\n" +
"my_metric,1562324643,1.000000,val1,val3,url=val2&y=1\n" +
"my_metric,1562324644,1.000000,val1,val3,name=val4&url=val2\n",
outputContent: "metric_name,timestamp,metric_value,check,error,extra_tags,metadata\n" +
"my_metric,1562324643,1.000000,val1,val3,url=val2,y=1\n" +
"my_metric,1562324644,1.000000,val1,val3,name=val4&url=val2,\n",
},
{
samples: []metrics.SampleContainer{
Expand Down Expand Up @@ -324,9 +327,9 @@ func TestRun(t *testing.T) {
fileName: "test",
fileReaderFunc: readUnCompressedFile,
timeFormat: "rfc3339",
outputContent: "metric_name,timestamp,metric_value,check,error,extra_tags\n" +
"my_metric," + time.Unix(1562324644, 0).Format(time.RFC3339) + ",1.000000,val1,val3,url=val2\n" +
"my_metric," + time.Unix(1562324644, 0).Format(time.RFC3339) + ",1.000000,val1,val3,name=val4&url=val2&y=2&z=3\n",
outputContent: "metric_name,timestamp,metric_value,check,error,extra_tags,metadata\n" +
"my_metric," + time.Unix(1562324644, 0).Format(time.RFC3339) + ",1.000000,val1,val3,url=val2,\n" +
"my_metric," + time.Unix(1562324644, 0).Format(time.RFC3339) + ",1.000000,val1,val3,name=val4&url=val2,y=2&z=3\n",
},
}

Expand Down Expand Up @@ -370,9 +373,9 @@ func sortExtraTagsForTest(t *testing.T, input string) string {
lines, err := r.ReadAll()
require.NoError(t, err)
for i, line := range lines[1:] {
extraTags := strings.Split(line[len(line)-1], "&")
extraTags := strings.Split(line[len(line)-2], "&")
sort.Strings(extraTags)
lines[i+1][len(line)-1] = strings.Join(extraTags, "&")
lines[i+1][len(line)-2] = strings.Join(extraTags, "&")
}
var b bytes.Buffer
w := csv.NewWriter(&b)
Expand Down

0 comments on commit 42db878

Please sign in to comment.