func GetLogLabels()

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
}