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
}