forked from open-telemetry/opentelemetry-collector-contrib
/
traceexporter.go
79 lines (64 loc) · 2.04 KB
/
traceexporter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package azuremonitorexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/azuremonitorexporter"
import (
"context"
"go.opentelemetry.io/collector/consumer/consumererror"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/exporterhelper"
"go.opentelemetry.io/collector/pdata/pcommon"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.uber.org/zap"
)
type traceExporter struct {
config *Config
transportChannel transportChannel
logger *zap.Logger
}
type traceVisitor struct {
processed int
err error
exporter *traceExporter
}
// Called for each tuple of Resource, InstrumentationScope, and Span
func (v *traceVisitor) visit(
resource pcommon.Resource,
scope pcommon.InstrumentationScope,
span ptrace.Span) (ok bool) {
envelopes, err := spanToEnvelopes(resource, scope, span, v.exporter.config.SpanEventsEnabled, v.exporter.logger)
if err != nil {
// record the error and short-circuit
v.err = consumererror.NewPermanent(err)
return false
}
for _, envelope := range envelopes {
envelope.IKey = string(v.exporter.config.InstrumentationKey)
// This is a fire and forget operation
v.exporter.transportChannel.Send(envelope)
}
v.processed++
return true
}
func (exporter *traceExporter) onTraceData(_ context.Context, traceData ptrace.Traces) error {
spanCount := traceData.SpanCount()
if spanCount == 0 {
return nil
}
visitor := &traceVisitor{exporter: exporter}
accept(traceData, visitor)
return visitor.err
}
// Returns a new instance of the trace exporter
func newTracesExporter(config *Config, transportChannel transportChannel, set exporter.CreateSettings) (exporter.Traces, error) {
exporter := &traceExporter{
config: config,
transportChannel: transportChannel,
logger: set.Logger,
}
return exporterhelper.NewTracesExporter(
context.TODO(),
set,
config,
exporter.onTraceData,
exporterhelper.WithQueue(config.QueueSettings))
}