in pkg/plugin/cloudlogging/cloudlogging.go [56:140]
func GetLogLabels(entry *loggingpb.LogEntry) data.Labels {
labels := make(data.Labels)
for k, v := range entry.GetLabels() {
labels[fmt.Sprintf("labels.\"%s\"", k)] = v
}
labels["id"] = entry.GetInsertId()
// This is how severity is set
labels["level"] = GetLogLevel(entry.GetSeverity())
resource := entry.GetResource()
if resourceType := resource.GetType(); resourceType != "" {
labels["resource.type"] = resourceType
}
// Add resource labels nested under `resource.labels.`
for k, v := range resource.GetLabels() {
labels[fmt.Sprintf("resource.labels.%s", k)] = v
}
switch t := entry.GetPayload().(type) {
case *loggingpb.LogEntry_JsonPayload:
fields := t.JsonPayload.GetFields()
for k, v := range fields {
if strings.ToLower(k) != "message" {
fieldToLabels(labels, fmt.Sprintf("jsonPayload.%s", k), v)
}
}
case *loggingpb.LogEntry_TextPayload:
labels["textPayload"] = t.TextPayload
case *loggingpb.LogEntry_ProtoPayload:
typeUrl := t.ProtoPayload.TypeUrl
if strings.HasSuffix(typeUrl, "AuditLog") {
var a alpb.AuditLog
if err := t.ProtoPayload.UnmarshalTo(&a); err != nil {
log.DefaultLogger.Error("Could not get AuditLog payload out of LogEntry: %v", err)
} else {
byteArr, _ := json.Marshal(a)
var inInterface map[string]*structpb.Value
json.Unmarshal(byteArr, &inInterface)
for k, v := range inInterface {
fieldToLabels(labels, fmt.Sprintf("protoPayload.%s", k), v)
}
}
} else if strings.HasSuffix(typeUrl, "RequestLog") {
var r rlpb.RequestLog
if err := t.ProtoPayload.UnmarshalTo(&r); err != nil {
log.DefaultLogger.Error("Could not get RequestLog payload out of LogEntry: %v", err)
} else {
byteArr, _ := json.Marshal(r)
var inInterface map[string]*structpb.Value
json.Unmarshal(byteArr, &inInterface)
for k, v := range inInterface {
fieldToLabels(labels, fmt.Sprintf("protoPayload.%s", k), v)
}
}
}
}
// If httpRequest exists in the log entry, include it too
httpRequest := entry.GetHttpRequest()
if httpRequest != nil {
byteArr, _ := json.Marshal(httpRequest)
var inInterface map[string]interface{}
json.Unmarshal(byteArr, &inInterface)
for k, v := range inInterface {
if k == "latency" {
labels["httpRequest.latency"] = httpRequest.Latency.AsDuration().String()
} else {
labels[fmt.Sprintf("httpRequest.%s", k)] = fmt.Sprintf("%v", v)
}
}
}
// Add trace data
traceId := entry.GetTrace()
spanId := entry.GetSpanId()
if traceId != "" {
trace := entry.GetTrace()
labels["trace"] = trace
labels["traceId"] = strings.Split(trace, "/")[len(strings.Split(trace, "/"))-1]
}
if spanId != "" {
labels["spanId"] = entry.GetSpanId()
}
return labels
}