1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- // Package exporterparser provides support for parsing and creating the
16- // respective exporters given a viper configuration .
15+ // Package exporterwrapper provides support for wrapping OC go library trace.Exporter into a
16+ // processor.TraceDataProcessor .
1717// For now it currently only provides statically imported OpenCensus
1818// exporters like:
1919// * Stackdriver Tracing and Monitoring
2020// * DataDog
2121// * Zipkin
22- package exporterparser
22+ package exporterwrapper
2323
2424import (
2525 "context"
@@ -29,41 +29,60 @@ import (
2929 tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
3030 "github.com/census-instrumentation/opencensus-service/data"
3131 "github.com/census-instrumentation/opencensus-service/internal"
32+ "github.com/census-instrumentation/opencensus-service/processor"
3233 spandatatranslator "github.com/census-instrumentation/opencensus-service/translator/trace/spandata"
3334)
3435
35- // OcProtoSpansToOCSpanDataInstrumented converts
36- // OpenCensus Proto TraceData to OpenCensus-Go SpanData.
37- // The "Instrumented" suffix serves to document that this
38- // function is traced but also has stats for self-observability.
36+ // NewExporterWrapper returns a processor.TraceDataProcessor that converts OpenCensus Proto TraceData
37+ // to OpenCensus-Go SpanData and calls into the given trace.Exporter.
3938//
4039// This is a bootstrapping mechanism for us to re-use as many of
4140// the OpenCensus-Go trace.SpanData exporters which were written
4241// by various vendors and contributors. Eventually the goal is to
4342// get those exporters converted to directly receive
4443// OpenCensus Proto TraceData.
45- func OcProtoSpansToOCSpanDataInstrumented (ctx context.Context , exporterName string , te trace.Exporter , td data.TraceData ) (aerr error ) {
44+ func NewExporterWrapper (exporterName string , ocExporter trace.Exporter ) processor.TraceDataProcessor {
45+ return & ocExporterWrapper {spanName : "opencensus.service.exporter." + exporterName + ".ExportTrace" , ocExporter : ocExporter }
46+ }
47+
48+ type ocExporterWrapper struct {
49+ spanName string
50+ ocExporter trace.Exporter
51+ }
52+
53+ var _ processor.TraceDataProcessor = (* ocExporterWrapper )(nil )
54+
55+ func (octew * ocExporterWrapper ) ProcessTraceData (ctx context.Context , td data.TraceData ) (aerr error ) {
4656 ctx , span := trace .StartSpan (ctx ,
47- "opencensus.service.exporter." + exporterName + ".ExportTrace" ,
48- trace .WithSampler (trace .NeverSample ()))
57+ octew .spanName , trace .WithSampler (trace .NeverSample ()))
4958
50- span .Annotate ([]trace.Attribute {
51- trace .Int64Attribute ("n_spans" , int64 (len (td .Spans ))),
52- }, "" )
59+ if span .IsRecordingEvents () {
60+ span .Annotate ([]trace.Attribute {
61+ trace .Int64Attribute ("n_spans" , int64 (len (td .Spans ))),
62+ }, "" )
63+ }
5364
5465 defer func () {
55- if aerr != nil {
66+ if aerr != nil && span . IsRecordingEvents () {
5667 span .SetStatus (trace.Status {Code : trace .StatusCodeInternal , Message : aerr .Error ()})
5768 }
5869 span .End ()
5970 }()
6071
72+ return PushOcProtoSpansToOCTraceExporter (octew .ocExporter , td )
73+ }
74+
75+ // TODO: Remove PushOcProtoSpansToOCTraceExporter after aws-xray is changed to ExporterWrapper.
76+
77+ // PushOcProtoSpansToOCTraceExporter pushes TraceData to the given trace.Exporter by converting the
78+ // protos to trace.SpanData.
79+ func PushOcProtoSpansToOCTraceExporter (ocExporter trace.Exporter , td data.TraceData ) error {
6180 var errs []error
6281 var goodSpans []* tracepb.Span
6382 for _ , span := range td .Spans {
6483 sd , err := spandatatranslator .ProtoSpanToOCSpanData (span )
6584 if err == nil {
66- te .ExportSpan (sd )
85+ ocExporter .ExportSpan (sd )
6786 goodSpans = append (goodSpans , span )
6887 } else {
6988 errs = append (errs , err )
0 commit comments