// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 package trace // import "go.opentelemetry.io/collector/receiver/otlpreceiver/internal/trace" import ( "context" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/obsreport" "go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp" ) const dataFormatProtobuf = "protobuf" // Receiver is the type used to handle spans from OpenTelemetry exporters. type Receiver struct { ptraceotlp.UnimplementedGRPCServer nextConsumer consumer.Traces obsrecv *obsreport.Receiver } // New creates a new Receiver reference. func New(nextConsumer consumer.Traces, obsrecv *obsreport.Receiver) *Receiver { return &Receiver{ nextConsumer: nextConsumer, obsrecv: obsrecv, } } // Export implements the service Export traces func. func (r *Receiver) Export(ctx context.Context, req ptraceotlp.ExportRequest) (ptraceotlp.ExportResponse, error) { td := req.Traces() // We need to ensure that it propagates the receiver name as a tag numSpans := td.SpanCount() if numSpans == 0 { return ptraceotlp.NewExportResponse(), nil } ctx = r.obsrecv.StartTracesOp(ctx) err := r.nextConsumer.ConsumeTraces(ctx, td) r.obsrecv.EndTracesOp(ctx, dataFormatProtobuf, numSpans, err) return ptraceotlp.NewExportResponse(), err }