Skip to content

Commit 94421e7

Browse files
authored
fix(daemon): Adds escaping for log forwarded labels (#1035)
This PR corrects how the collector JSON for log forwarded labels handles log label key and values which have characters which must be escaped for JSON marshaling. The change is restricted to the daemon code to generate the log label JSON and does not impact the agent side of things. The fix is to use the Go `json` module to handle the creation of the JSON. It will handle the escaping as needed. The array of label key/value pairs is converted to a Go `map` which is then marshaled into JSON. The case where either the label or value is empty (an invalid label) is handled so that these are not forwarded. This case should not occur as labels of this type should not be created by the agent but this check is added as additional protection against this case.
1 parent 11a026f commit 94421e7

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

daemon/internal/newrelic/log_events.go

+15-11
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,25 @@ func (events *LogEvents) CollectorJSON(id AgentRunID) ([]byte, error) {
7676
estimate := len(es) * 128
7777
buf.Grow(estimate)
7878
buf.WriteString(`[{` +
79-
`"common": {"attributes": {`)
79+
`"common": {"attributes": `)
8080
nwrit := 0
81-
for _, value := range events.LogForwardingLabels {
82-
if nwrit > 0 {
83-
buf.WriteByte(',')
81+
labelMap := make(map[string]string)
82+
for _, label := range events.LogForwardingLabels {
83+
// safegaurd against invalid labels
84+
if len(label.LabelType) != 0 && len(label.LabelValue) != 0 {
85+
labelMap["tags."+label.LabelType] = label.LabelValue
8486
}
85-
nwrit++
86-
buf.WriteString(`"tags.`)
87-
buf.WriteString(value.LabelType)
88-
buf.WriteString(`":"`)
89-
buf.WriteString(value.LabelValue)
90-
buf.WriteString(`"`)
9187
}
9288

93-
buf.WriteString(`}},` +
89+
j, e := json.Marshal(labelMap)
90+
if e != nil {
91+
log.Errorf("failed to marshal log label: %s", e)
92+
buf.WriteString("{}")
93+
} else {
94+
buf.Write(j)
95+
}
96+
97+
buf.WriteString(`},` +
9498
`"logs": [`)
9599

96100
nwrit = 0

daemon/internal/newrelic/log_events_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ var (
2727
LogForwardingLabelsTestCase{name: "Invalid keys", labels: `[{"label_tipe":"type1","label_valyue":"value1"}]`, expected: `{}`},
2828
LogForwardingLabelsTestCase{name: "Space in value", labels: `[{"label_type":"type1","label_value":"value 1"}]`, expected: `{"tags.type1":"value 1"}`},
2929
LogForwardingLabelsTestCase{name: "Space in key", labels: `[{"label_type":"type 1","label_value":"value1"}]`, expected: `{"tags.type 1":"value1"}`},
30+
LogForwardingLabelsTestCase{name: "Empty value", labels: `[{"label_type":"type1","label_value":""}]`, expected: `{}`},
31+
LogForwardingLabelsTestCase{name: "Empty key", labels: `[{"label_type":"","label_value":"value1"}]`, expected: `{}`},
3032
}
3133
)
3234

0 commit comments

Comments
 (0)