in plugins/outputs/cloudwatchlogs/cloudwatchlogs.go [225:298]
func (c *CloudWatchLogs) getLogEventFromMetric(metric telegraf.Metric) *structuredLogEvent {
var message string
if metric.HasField(LogEntryField) {
var ok bool
if message, ok = metric.Fields()[LogEntryField].(string); !ok {
c.Log.Warnf("The log entry value field is not string type: %v", metric.Fields())
return nil
}
} else {
content := map[string]interface{}{}
tags := metric.Tags()
// build all the attributesInFields
if val, ok := tags[attributesInFields]; ok {
attributes := strings.Split(val, ",")
mFields := metric.Fields()
for _, attr := range attributes {
if fieldVal, ok := mFields[attr]; ok {
content[attr] = fieldVal
metric.RemoveField(attr)
}
}
metric.RemoveTag(attributesInFields)
delete(tags, attributesInFields)
}
// build remaining attributes
for k := range tags {
content[k] = tags[k]
}
for k, v := range metric.Fields() {
var value interface{}
switch t := v.(type) {
case int:
value = float64(t)
case int32:
value = float64(t)
case int64:
value = float64(t)
case uint:
value = float64(t)
case uint32:
value = float64(t)
case uint64:
value = float64(t)
case float64:
value = t
case bool:
value = t
case string:
value = t
case time.Time:
value = float64(t.Unix())
default:
c.Log.Errorf("Detected unexpected fields (%s,%v) when encoding structured log event, value type %T is not supported", k, v, v)
return nil
}
content[k] = value
}
jsonMap, err := json.Marshal(content)
if err != nil {
c.Log.Errorf("Unalbe to marshal structured log content: %v", err)
}
message = string(jsonMap)
}
return &structuredLogEvent{
msg: message,
t: metric.Time(),
}
}