| 775 | } |
| 776 | |
| 777 | func ParquetTraceToTempopbTrace(meta *backend.BlockMeta, parquetTrace *Trace) *tempopb.Trace { |
| 778 | protoTrace := &tempopb.Trace{} |
| 779 | protoTrace.ResourceSpans = make([]*v1_trace.ResourceSpans, 0, len(parquetTrace.ResourceSpans)) |
| 780 | |
| 781 | // dedicated attribute column assignments |
| 782 | dedicatedResourceAttributes := dedicatedColumnsToColumnMapping(meta.DedicatedColumns, backend.DedicatedColumnScopeResource) |
| 783 | dedicatedSpanAttributes := dedicatedColumnsToColumnMapping(meta.DedicatedColumns, backend.DedicatedColumnScopeSpan) |
| 784 | dedicatedEventAttributes := dedicatedColumnsToColumnMapping(meta.DedicatedColumns, backend.DedicatedColumnScopeEvent) |
| 785 | |
| 786 | for _, rs := range parquetTrace.ResourceSpans { |
| 787 | protoBatch := &v1_trace.ResourceSpans{} |
| 788 | resAttrs := parquetToProtoAttrs(rs.Resource.Attrs) |
| 789 | protoBatch.Resource = &v1_resource.Resource{ |
| 790 | Attributes: resAttrs, |
| 791 | DroppedAttributesCount: uint32(rs.Resource.DroppedAttributesCount), |
| 792 | } |
| 793 | |
| 794 | // dynamically assigned dedicated resource attribute columns |
| 795 | for attr, col := range dedicatedResourceAttributes.items() { |
| 796 | val := col.readValue(&rs.Resource.DedicatedAttributes) |
| 797 | if val != nil { |
| 798 | protoBatch.Resource.Attributes = append(protoBatch.Resource.Attributes, &v1.KeyValue{ |
| 799 | Key: attr, |
| 800 | Value: val, |
| 801 | }) |
| 802 | } |
| 803 | } |
| 804 | |
| 805 | // known resource attributes |
| 806 | if rs.Resource.ServiceName != "" { |
| 807 | protoBatch.Resource.Attributes = append(protoBatch.Resource.Attributes, &v1.KeyValue{ |
| 808 | Key: LabelServiceName, |
| 809 | Value: &v1.AnyValue{ |
| 810 | Value: &v1.AnyValue_StringValue{ |
| 811 | StringValue: rs.Resource.ServiceName, |
| 812 | }, |
| 813 | }, |
| 814 | }) |
| 815 | } |
| 816 | |
| 817 | protoBatch.ScopeSpans = make([]*v1_trace.ScopeSpans, 0, len(rs.ScopeSpans)) |
| 818 | |
| 819 | for _, scopeSpan := range rs.ScopeSpans { |
| 820 | protoSS := &v1_trace.ScopeSpans{ |
| 821 | Scope: parquetToProtoInstrumentationScope(&scopeSpan.Scope), |
| 822 | } |
| 823 | |
| 824 | protoSS.Spans = make([]*v1_trace.Span, 0, len(scopeSpan.Spans)) |
| 825 | for _, span := range scopeSpan.Spans { |
| 826 | |
| 827 | spanAttr := parquetToProtoAttrs(span.Attrs) |
| 828 | protoSpan := &v1_trace.Span{ |
| 829 | TraceId: parquetTrace.TraceID, |
| 830 | SpanId: span.SpanID, |
| 831 | TraceState: span.TraceState, |
| 832 | Name: span.Name, |
| 833 | Kind: v1_trace.Span_SpanKind(span.Kind), |
| 834 | ParentSpanId: span.ParentSpanID, |