func createTraceSpanFrame()

in pkg/plugin/plugin.go [269:319]


func createTraceSpanFrame(trace *tracepb.Trace) *data.Frame {
	// Create one frame for all trace/spans
	f := data.NewFrame(trace.GetTraceId())
	f.Meta = &data.FrameMeta{}
	f.Meta.PreferredVisualization = data.VisTypeTrace

	// Create one set of fields for all trace/spans
	traceIDField := data.NewField("traceID", nil, []string{})
	spanIDField := data.NewField("spanID", nil, []string{})
	parentSpanIDField := data.NewField("parentSpanID", nil, []string{})
	operationNameField := data.NewField("operationName", nil, []string{})
	serviceNameField := data.NewField("serviceName", nil, []string{})
	serviceTagsField := data.NewField("serviceTags", nil, []json.RawMessage{})
	startTimeField := data.NewField("startTime", nil, []time.Time{})
	durationField := data.NewField("duration", nil, []float64{})
	tagsField := data.NewField("tags", nil, []json.RawMessage{})

	// Add values to each field for each span
	for _, s := range trace.Spans {
		serviceTags, spanTags, err := cloudtrace.GetTags(s)
		if err != nil {
			log.DefaultLogger.Warn("failed getting span tags", "error", err)
			continue
		}
		tagsField.Append(spanTags)
		serviceTagsField.Append(serviceTags)

		traceIDField.Append(trace.GetTraceId())
		spanIDField.Append(strconv.FormatUint(s.GetSpanId(), 10))
		parentSpanIDField.Append(strconv.FormatUint(s.GetParentSpanId(), 10))
		operationNameField.Append(cloudtrace.GetSpanOperationName(s))
		serviceNameField.Append(cloudtrace.GetServiceName(s))
		startTimeField.Append(s.GetStartTime().AsTime())
		duration := float64(s.GetEndTime().AsTime().UnixMicro()-s.GetStartTime().AsTime().UnixMicro()) / 1000
		durationField.Append(duration)
	}

	f.Fields = append(f.Fields,
		traceIDField,
		parentSpanIDField,
		spanIDField,
		serviceNameField,
		operationNameField,
		serviceTagsField,
		tagsField,
		startTimeField,
		durationField,
	)

	return f
}