You've already forked opentelemetry-go
mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-11-25 22:41:46 +02:00
Merge sdk/export/trace into sdk/trace (#1778)
* Merge sdk/export/trace into sdk/trace * Update package move * Add changes to changelog * Add PR number to changelog
This commit is contained in:
@@ -60,6 +60,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
- The `DroppedAttributeCount` field of the `Span` in the `go.opentelemetry.io/otel` package now only represents the number of attributes dropped for the span itself.
|
- The `DroppedAttributeCount` field of the `Span` in the `go.opentelemetry.io/otel` package now only represents the number of attributes dropped for the span itself.
|
||||||
It no longer is a conglomerate of itself, events, and link attributes that have been dropped. (#1771)
|
It no longer is a conglomerate of itself, events, and link attributes that have been dropped. (#1771)
|
||||||
- Make `ExportSpans` in Jaeger Exporter honor context deadline. (#1773)
|
- Make `ExportSpans` in Jaeger Exporter honor context deadline. (#1773)
|
||||||
|
- The `go.opentelemetry.io/otel/sdk/export/trace` package is merged into the `go.opentelemetry.io/otel/sdk/trace` package. (#1778)
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ import (
|
|||||||
"go.opentelemetry.io/otel/bridge/opencensus"
|
"go.opentelemetry.io/otel/bridge/opencensus"
|
||||||
"go.opentelemetry.io/otel/exporters/stdout"
|
"go.opentelemetry.io/otel/exporters/stdout"
|
||||||
otmetricexport "go.opentelemetry.io/otel/sdk/export/metric"
|
otmetricexport "go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
ottraceexport "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -63,7 +62,7 @@ func main() {
|
|||||||
|
|
||||||
// tracing demonstrates overriding the OpenCensus DefaultTracer to send spans
|
// tracing demonstrates overriding the OpenCensus DefaultTracer to send spans
|
||||||
// to the OpenTelemetry exporter by calling OpenCensus APIs.
|
// to the OpenTelemetry exporter by calling OpenCensus APIs.
|
||||||
func tracing(otExporter ottraceexport.SpanExporter) {
|
func tracing(otExporter sdktrace.SpanExporter) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
log.Println("Configuring OpenCensus. Not Registering any OpenCensus exporters.")
|
log.Println("Configuring OpenCensus. Not Registering any OpenCensus exporters.")
|
||||||
|
|||||||
@@ -24,10 +24,10 @@ import (
|
|||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/metric/number"
|
"go.opentelemetry.io/otel/metric/number"
|
||||||
exportmetric "go.opentelemetry.io/otel/sdk/export/metric"
|
exportmetric "go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
exporttrace "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/metric/aggregator/sum"
|
"go.opentelemetry.io/otel/sdk/metric/aggregator/sum"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -80,8 +80,8 @@ func (OneRecordCheckpointSet) ForEach(kindSelector exportmetric.ExportKindSelect
|
|||||||
|
|
||||||
// SingleSpanSnapshot returns a one-element slice with a snapshot. It
|
// SingleSpanSnapshot returns a one-element slice with a snapshot. It
|
||||||
// may be useful for testing driver's trace export.
|
// may be useful for testing driver's trace export.
|
||||||
func SingleSpanSnapshot() []*exporttrace.SpanSnapshot {
|
func SingleSpanSnapshot() []*tracesdk.SpanSnapshot {
|
||||||
sd := &exporttrace.SpanSnapshot{
|
sd := &tracesdk.SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8, 9},
|
TraceID: trace.TraceID{2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8, 9},
|
||||||
SpanID: trace.SpanID{3, 4, 5, 6, 7, 8, 9, 0},
|
SpanID: trace.SpanID{3, 4, 5, 6, 7, 8, 9, 0},
|
||||||
@@ -111,7 +111,7 @@ func SingleSpanSnapshot() []*exporttrace.SpanSnapshot {
|
|||||||
Version: "0.0.0",
|
Version: "0.0.0",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return []*exporttrace.SpanSnapshot{sd}
|
return []*tracesdk.SpanSnapshot{sd}
|
||||||
}
|
}
|
||||||
|
|
||||||
// EmptyCheckpointSet is a checkpointer that has no records at all.
|
// EmptyCheckpointSet is a checkpointer that has no records at all.
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ import (
|
|||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||||
|
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ const (
|
|||||||
|
|
||||||
// SpanData transforms a slice of SpanSnapshot into a slice of OTLP
|
// SpanData transforms a slice of SpanSnapshot into a slice of OTLP
|
||||||
// ResourceSpans.
|
// ResourceSpans.
|
||||||
func SpanData(sdl []*export.SpanSnapshot) []*tracepb.ResourceSpans {
|
func SpanData(sdl []*tracesdk.SpanSnapshot) []*tracepb.ResourceSpans {
|
||||||
if len(sdl) == 0 {
|
if len(sdl) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,7 @@ func SpanData(sdl []*export.SpanSnapshot) []*tracepb.ResourceSpans {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// span transforms a Span into an OTLP span.
|
// span transforms a Span into an OTLP span.
|
||||||
func span(sd *export.SpanSnapshot) *tracepb.Span {
|
func span(sd *tracesdk.SpanSnapshot) *tracepb.Span {
|
||||||
if sd == nil {
|
if sd == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ import (
|
|||||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSpanKind(t *testing.T) {
|
func TestSpanKind(t *testing.T) {
|
||||||
@@ -199,7 +199,7 @@ func TestSpanData(t *testing.T) {
|
|||||||
startTime := time.Unix(1585674086, 1234)
|
startTime := time.Unix(1585674086, 1234)
|
||||||
endTime := startTime.Add(10 * time.Second)
|
endTime := startTime.Add(10 * time.Second)
|
||||||
traceState, _ := trace.TraceStateFromKeyValues(attribute.String("key1", "val1"), attribute.String("key2", "val2"))
|
traceState, _ := trace.TraceStateFromKeyValues(attribute.String("key1", "val1"), attribute.String("key2", "val2"))
|
||||||
spanData := &export.SpanSnapshot{
|
spanData := &tracesdk.SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
TraceID: trace.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F},
|
||||||
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
SpanID: trace.SpanID{0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8},
|
||||||
@@ -285,7 +285,7 @@ func TestSpanData(t *testing.T) {
|
|||||||
DroppedLinksCount: 3,
|
DroppedLinksCount: 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
got := SpanData([]*export.SpanSnapshot{spanData})
|
got := SpanData([]*tracesdk.SpanSnapshot{spanData})
|
||||||
require.Len(t, got, 1)
|
require.Len(t, got, 1)
|
||||||
|
|
||||||
assert.Equal(t, got[0].GetResource(), Resource(spanData.Resource))
|
assert.Equal(t, got[0].GetResource(), Resource(spanData.Resource))
|
||||||
@@ -302,7 +302,7 @@ func TestSpanData(t *testing.T) {
|
|||||||
|
|
||||||
// Empty parent span ID should be treated as root span.
|
// Empty parent span ID should be treated as root span.
|
||||||
func TestRootSpanData(t *testing.T) {
|
func TestRootSpanData(t *testing.T) {
|
||||||
sd := SpanData([]*export.SpanSnapshot{{}})
|
sd := SpanData([]*tracesdk.SpanSnapshot{{}})
|
||||||
require.Len(t, sd, 1)
|
require.Len(t, sd, 1)
|
||||||
rs := sd[0]
|
rs := sd[0]
|
||||||
got := rs.GetInstrumentationLibrarySpans()[0].GetSpans()[0].GetParentSpanId()
|
got := rs.GetInstrumentationLibrarySpans()[0].GetSpans()[0].GetParentSpanId()
|
||||||
@@ -312,5 +312,5 @@ func TestRootSpanData(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSpanDataNilResource(t *testing.T) {
|
func TestSpanDataNilResource(t *testing.T) {
|
||||||
assert.NotPanics(t, func() { SpanData([]*export.SpanSnapshot{{}}) })
|
assert.NotPanics(t, func() { SpanData([]*tracesdk.SpanSnapshot{{}}) })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import (
|
|||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
"go.opentelemetry.io/otel/sdk/export/metric/aggregation"
|
"go.opentelemetry.io/otel/sdk/export/metric/aggregation"
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/export/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Exporter is an OpenTelemetry exporter. It exports both traces and metrics
|
// Exporter is an OpenTelemetry exporter. It exports both traces and metrics
|
||||||
@@ -111,8 +111,7 @@ func (e *Exporter) Shutdown(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Export implements the "go.opentelemetry.io/otel/sdk/export/metric".Exporter
|
// Export transforms and batches metric Records into OTLP Metrics and
|
||||||
// interface. It transforms and batches metric Records into OTLP Metrics and
|
|
||||||
// transmits them to the configured collector.
|
// transmits them to the configured collector.
|
||||||
func (e *Exporter) Export(parent context.Context, cps metricsdk.CheckpointSet) error {
|
func (e *Exporter) Export(parent context.Context, cps metricsdk.CheckpointSet) error {
|
||||||
return e.driver.ExportMetrics(parent, cps, e.cfg.exportKindSelector)
|
return e.driver.ExportMetrics(parent, cps, e.cfg.exportKindSelector)
|
||||||
@@ -124,10 +123,8 @@ func (e *Exporter) ExportKindFor(desc *metric.Descriptor, kind aggregation.Kind)
|
|||||||
return e.cfg.exportKindSelector.ExportKindFor(desc, kind)
|
return e.cfg.exportKindSelector.ExportKindFor(desc, kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExportSpans implements the
|
// ExportSpans transforms and batches trace SpanSnapshots into OTLP Trace and
|
||||||
// "go.opentelemetry.io/otel/sdk/export/trace".SpanExporter interface. It
|
// transmits them to the configured collector.
|
||||||
// transforms and batches trace SpanSnapshots into OTLP Trace and transmits them
|
|
||||||
// to the configured collector.
|
|
||||||
func (e *Exporter) ExportSpans(ctx context.Context, ss []*tracesdk.SpanSnapshot) error {
|
func (e *Exporter) ExportSpans(ctx context.Context, ss []*tracesdk.SpanSnapshot) error {
|
||||||
return e.driver.ExportTraces(ctx, ss)
|
return e.driver.ExportTraces(ctx, ss)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ import (
|
|||||||
resourcepb "go.opentelemetry.io/proto/otlp/resource/v1"
|
resourcepb "go.opentelemetry.io/proto/otlp/resource/v1"
|
||||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||||
|
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestExportSpans(t *testing.T) {
|
func TestExportSpans(t *testing.T) {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import (
|
|||||||
"go.opentelemetry.io/otel/exporters/otlp"
|
"go.opentelemetry.io/otel/exporters/otlp"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/internal/transform"
|
"go.opentelemetry.io/otel/exporters/otlp/internal/transform"
|
||||||
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/export/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
metricpb "go.opentelemetry.io/proto/otlp/metrics/v1"
|
metricpb "go.opentelemetry.io/proto/otlp/metrics/v1"
|
||||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import (
|
|||||||
"go.opentelemetry.io/otel/exporters/otlp"
|
"go.opentelemetry.io/otel/exporters/otlp"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/internal/transform"
|
"go.opentelemetry.io/otel/exporters/otlp/internal/transform"
|
||||||
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/export/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
colmetricpb "go.opentelemetry.io/proto/otlp/collector/metrics/v1"
|
colmetricpb "go.opentelemetry.io/proto/otlp/collector/metrics/v1"
|
||||||
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
||||||
metricpb "go.opentelemetry.io/proto/otlp/metrics/v1"
|
metricpb "go.opentelemetry.io/proto/otlp/metrics/v1"
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import (
|
|||||||
"go.opentelemetry.io/otel/exporters/otlp"
|
"go.opentelemetry.io/otel/exporters/otlp"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/internal/otlptest"
|
"go.opentelemetry.io/otel/exporters/otlp/internal/otlptest"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlpgrpc"
|
"go.opentelemetry.io/otel/exporters/otlp/otlpgrpc"
|
||||||
exporttrace "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
||||||
)
|
)
|
||||||
@@ -161,7 +160,7 @@ func TestNewExporter_collectorConnectionDiesThenReconnectsWhenInRestMode(t *test
|
|||||||
// trigger almost immediate reconnection
|
// trigger almost immediate reconnection
|
||||||
require.Error(
|
require.Error(
|
||||||
t,
|
t,
|
||||||
exp.ExportSpans(ctx, []*exporttrace.SpanSnapshot{{Name: "in the midst"}}),
|
exp.ExportSpans(ctx, []*sdktrace.SpanSnapshot{{Name: "in the midst"}}),
|
||||||
"transport: Error while dialing dial tcp %s: connect: connection refused",
|
"transport: Error while dialing dial tcp %s: connect: connection refused",
|
||||||
mc.endpoint,
|
mc.endpoint,
|
||||||
)
|
)
|
||||||
@@ -173,7 +172,7 @@ func TestNewExporter_collectorConnectionDiesThenReconnectsWhenInRestMode(t *test
|
|||||||
// send message to disconnected channel but this time reconnection gouroutine will be in (rest mode, not listening to the disconnected channel)
|
// send message to disconnected channel but this time reconnection gouroutine will be in (rest mode, not listening to the disconnected channel)
|
||||||
require.Error(
|
require.Error(
|
||||||
t,
|
t,
|
||||||
exp.ExportSpans(ctx, []*exporttrace.SpanSnapshot{{Name: "in the midst"}}),
|
exp.ExportSpans(ctx, []*sdktrace.SpanSnapshot{{Name: "in the midst"}}),
|
||||||
"transport: Error while dialing dial tcp %s: connect: connection refused2",
|
"transport: Error while dialing dial tcp %s: connect: connection refused2",
|
||||||
mc.endpoint,
|
mc.endpoint,
|
||||||
)
|
)
|
||||||
@@ -191,7 +190,7 @@ func TestNewExporter_collectorConnectionDiesThenReconnectsWhenInRestMode(t *test
|
|||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
// when disconnected exp.ExportSpans doesnt send disconnected messages again
|
// when disconnected exp.ExportSpans doesnt send disconnected messages again
|
||||||
// it just quits and return last connection error
|
// it just quits and return last connection error
|
||||||
require.NoError(t, exp.ExportSpans(ctx, []*exporttrace.SpanSnapshot{{Name: "Resurrected"}}))
|
require.NoError(t, exp.ExportSpans(ctx, []*sdktrace.SpanSnapshot{{Name: "Resurrected"}}))
|
||||||
}
|
}
|
||||||
|
|
||||||
nmaSpans := nmc.getSpans()
|
nmaSpans := nmc.getSpans()
|
||||||
@@ -231,7 +230,7 @@ func TestNewExporter_collectorConnectionDiesThenReconnects(t *testing.T) {
|
|||||||
// No endpoint up.
|
// No endpoint up.
|
||||||
require.Error(
|
require.Error(
|
||||||
t,
|
t,
|
||||||
exp.ExportSpans(ctx, []*exporttrace.SpanSnapshot{{Name: "in the midst"}}),
|
exp.ExportSpans(ctx, []*sdktrace.SpanSnapshot{{Name: "in the midst"}}),
|
||||||
"transport: Error while dialing dial tcp %s: connect: connection refused",
|
"transport: Error while dialing dial tcp %s: connect: connection refused",
|
||||||
mc.endpoint,
|
mc.endpoint,
|
||||||
)
|
)
|
||||||
@@ -245,7 +244,7 @@ func TestNewExporter_collectorConnectionDiesThenReconnects(t *testing.T) {
|
|||||||
|
|
||||||
n := 10
|
n := 10
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
require.NoError(t, exp.ExportSpans(ctx, []*exporttrace.SpanSnapshot{{Name: "Resurrected"}}))
|
require.NoError(t, exp.ExportSpans(ctx, []*sdktrace.SpanSnapshot{{Name: "Resurrected"}}))
|
||||||
}
|
}
|
||||||
|
|
||||||
nmaSpans := nmc.getSpans()
|
nmaSpans := nmc.getSpans()
|
||||||
@@ -305,7 +304,7 @@ func TestNewExporter_withHeaders(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
exp := newGRPCExporter(t, ctx, mc.endpoint,
|
exp := newGRPCExporter(t, ctx, mc.endpoint,
|
||||||
otlpgrpc.WithHeaders(map[string]string{"header1": "value1"}))
|
otlpgrpc.WithHeaders(map[string]string{"header1": "value1"}))
|
||||||
require.NoError(t, exp.ExportSpans(ctx, []*exporttrace.SpanSnapshot{{Name: "in the midst"}}))
|
require.NoError(t, exp.ExportSpans(ctx, []*sdktrace.SpanSnapshot{{Name: "in the midst"}}))
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
_ = exp.Shutdown(ctx)
|
_ = exp.Shutdown(ctx)
|
||||||
@@ -329,7 +328,7 @@ func TestNewExporter_withInvalidSecurityConfiguration(t *testing.T) {
|
|||||||
t.Fatalf("failed to create a new collector exporter: %v", err)
|
t.Fatalf("failed to create a new collector exporter: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = exp.ExportSpans(ctx, []*exporttrace.SpanSnapshot{{Name: "misconfiguration"}})
|
err = exp.ExportSpans(ctx, []*sdktrace.SpanSnapshot{{Name: "misconfiguration"}})
|
||||||
require.Equal(t, err.Error(), "exporter disconnected: grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)")
|
require.Equal(t, err.Error(), "exporter disconnected: grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)")
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import (
|
|||||||
"go.opentelemetry.io/otel/exporters/otlp"
|
"go.opentelemetry.io/otel/exporters/otlp"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/internal/transform"
|
"go.opentelemetry.io/otel/exporters/otlp/internal/transform"
|
||||||
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/export/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
colmetricspb "go.opentelemetry.io/proto/otlp/collector/metrics/v1"
|
colmetricspb "go.opentelemetry.io/proto/otlp/collector/metrics/v1"
|
||||||
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
metricsdk "go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/export/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProtocolDriver is an interface used by OTLP exporter. It's
|
// ProtocolDriver is an interface used by OTLP exporter. It's
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import (
|
|||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/metric/global"
|
"go.opentelemetry.io/otel/metric/global"
|
||||||
"go.opentelemetry.io/otel/sdk/export/metric"
|
"go.opentelemetry.io/otel/sdk/export/metric"
|
||||||
exporttrace "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
controller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
|
controller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
|
||||||
processor "go.opentelemetry.io/otel/sdk/metric/processor/basic"
|
processor "go.opentelemetry.io/otel/sdk/metric/processor/basic"
|
||||||
"go.opentelemetry.io/otel/sdk/metric/selector/simple"
|
"go.opentelemetry.io/otel/sdk/metric/selector/simple"
|
||||||
@@ -34,8 +33,8 @@ type Exporter struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ metric.Exporter = &Exporter{}
|
_ metric.Exporter = &Exporter{}
|
||||||
_ exporttrace.SpanExporter = &Exporter{}
|
_ sdktrace.SpanExporter = &Exporter{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewExporter creates an Exporter with the passed options.
|
// NewExporter creates an Exporter with the passed options.
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/export/trace"
|
"go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Exporter is an implementation of trace.SpanSyncer that writes spans to stdout.
|
// Exporter is an implementation of trace.SpanSyncer that writes spans to stdout.
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ import (
|
|||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
"go.opentelemetry.io/otel/exporters/stdout"
|
"go.opentelemetry.io/otel/exporters/stdout"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ func TestExporter_ExportSpan(t *testing.T) {
|
|||||||
doubleValue := 123.456
|
doubleValue := 123.456
|
||||||
resource := resource.NewWithAttributes(attribute.String("rk1", "rv11"))
|
resource := resource.NewWithAttributes(attribute.String("rk1", "rv11"))
|
||||||
|
|
||||||
testSpan := &export.SpanSnapshot{
|
testSpan := &tracesdk.SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: traceID,
|
TraceID: traceID,
|
||||||
SpanID: spanID,
|
SpanID: spanID,
|
||||||
@@ -69,7 +69,7 @@ func TestExporter_ExportSpan(t *testing.T) {
|
|||||||
StatusMessage: "interesting",
|
StatusMessage: "interesting",
|
||||||
Resource: resource,
|
Resource: resource,
|
||||||
}
|
}
|
||||||
if err := ex.ExportSpans(context.Background(), []*export.SpanSnapshot{testSpan}); err != nil {
|
if err := ex.ExportSpans(context.Background(), []*tracesdk.SpanSnapshot{testSpan}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import (
|
|||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
gen "go.opentelemetry.io/otel/exporters/trace/jaeger/internal/gen-go/jaeger"
|
gen "go.opentelemetry.io/otel/exporters/trace/jaeger/internal/gen-go/jaeger"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/semconv"
|
"go.opentelemetry.io/otel/semconv"
|
||||||
@@ -121,8 +120,8 @@ func NewRawExporter(endpointOption EndpointOption, opts ...Option) (*Exporter, e
|
|||||||
o: o,
|
o: o,
|
||||||
defaultServiceName: defaultServiceName,
|
defaultServiceName: defaultServiceName,
|
||||||
}
|
}
|
||||||
bundler := bundler.NewBundler((*export.SpanSnapshot)(nil), func(bundle interface{}) {
|
bundler := bundler.NewBundler((*sdktrace.SpanSnapshot)(nil), func(bundle interface{}) {
|
||||||
if err := e.upload(bundle.([]*export.SpanSnapshot)); err != nil {
|
if err := e.upload(bundle.([]*sdktrace.SpanSnapshot)); err != nil {
|
||||||
otel.Handle(err)
|
otel.Handle(err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -200,10 +199,10 @@ type Exporter struct {
|
|||||||
defaultServiceName string
|
defaultServiceName string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ export.SpanExporter = (*Exporter)(nil)
|
var _ sdktrace.SpanExporter = (*Exporter)(nil)
|
||||||
|
|
||||||
// ExportSpans exports SpanSnapshots to Jaeger.
|
// ExportSpans exports SpanSnapshots to Jaeger.
|
||||||
func (e *Exporter) ExportSpans(ctx context.Context, ss []*export.SpanSnapshot) error {
|
func (e *Exporter) ExportSpans(ctx context.Context, ss []*sdktrace.SpanSnapshot) error {
|
||||||
e.stoppedMu.RLock()
|
e.stoppedMu.RLock()
|
||||||
stopped := e.stopped
|
stopped := e.stopped
|
||||||
e.stoppedMu.RUnlock()
|
e.stoppedMu.RUnlock()
|
||||||
@@ -258,7 +257,7 @@ func (e *Exporter) Shutdown(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func spanSnapshotToThrift(ss *export.SpanSnapshot) *gen.Span {
|
func spanSnapshotToThrift(ss *sdktrace.SpanSnapshot) *gen.Span {
|
||||||
tags := make([]*gen.Tag, 0, len(ss.Attributes))
|
tags := make([]*gen.Tag, 0, len(ss.Attributes))
|
||||||
for _, kv := range ss.Attributes {
|
for _, kv := range ss.Attributes {
|
||||||
tag := keyValueToTag(kv)
|
tag := keyValueToTag(kv)
|
||||||
@@ -425,7 +424,7 @@ func (e *Exporter) Flush() {
|
|||||||
flush(e)
|
flush(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Exporter) upload(spans []*export.SpanSnapshot) error {
|
func (e *Exporter) upload(spans []*sdktrace.SpanSnapshot) error {
|
||||||
batchList := jaegerBatchList(spans, e.defaultServiceName)
|
batchList := jaegerBatchList(spans, e.defaultServiceName)
|
||||||
for _, batch := range batchList {
|
for _, batch := range batchList {
|
||||||
err := e.uploader.upload(batch)
|
err := e.uploader.upload(batch)
|
||||||
@@ -439,7 +438,7 @@ func (e *Exporter) upload(spans []*export.SpanSnapshot) error {
|
|||||||
|
|
||||||
// jaegerBatchList transforms a slice of SpanSnapshot into a slice of jaeger
|
// jaegerBatchList transforms a slice of SpanSnapshot into a slice of jaeger
|
||||||
// Batch.
|
// Batch.
|
||||||
func jaegerBatchList(ssl []*export.SpanSnapshot, defaultServiceName string) []*gen.Batch {
|
func jaegerBatchList(ssl []*sdktrace.SpanSnapshot, defaultServiceName string) []*gen.Batch {
|
||||||
if len(ssl) == 0 {
|
if len(ssl) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ import (
|
|||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
gen "go.opentelemetry.io/otel/exporters/trace/jaeger/internal/gen-go/jaeger"
|
gen "go.opentelemetry.io/otel/exporters/trace/jaeger/internal/gen-go/jaeger"
|
||||||
ottest "go.opentelemetry.io/otel/internal/internaltest"
|
ottest "go.opentelemetry.io/otel/internal/internaltest"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
@@ -372,12 +371,12 @@ func Test_spanSnapshotToThrift(t *testing.T) {
|
|||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
data *export.SpanSnapshot
|
data *sdktrace.SpanSnapshot
|
||||||
want *gen.Span
|
want *gen.Span
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "no status description",
|
name: "no status description",
|
||||||
data: &export.SpanSnapshot{
|
data: &sdktrace.SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: traceID,
|
TraceID: traceID,
|
||||||
SpanID: spanID,
|
SpanID: spanID,
|
||||||
@@ -411,7 +410,7 @@ func Test_spanSnapshotToThrift(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no parent",
|
name: "no parent",
|
||||||
data: &export.SpanSnapshot{
|
data: &sdktrace.SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: traceID,
|
TraceID: traceID,
|
||||||
SpanID: spanID,
|
SpanID: spanID,
|
||||||
@@ -500,7 +499,7 @@ func Test_spanSnapshotToThrift(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "with parent",
|
name: "with parent",
|
||||||
data: &export.SpanSnapshot{
|
data: &sdktrace.SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: traceID,
|
TraceID: traceID,
|
||||||
SpanID: spanID,
|
SpanID: spanID,
|
||||||
@@ -557,7 +556,7 @@ func Test_spanSnapshotToThrift(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "resources do not affect the tags",
|
name: "resources do not affect the tags",
|
||||||
data: &export.SpanSnapshot{
|
data: &sdktrace.SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: traceID,
|
TraceID: traceID,
|
||||||
SpanID: spanID,
|
SpanID: spanID,
|
||||||
@@ -664,7 +663,7 @@ func TestExporterExportSpansHonorsCancel(t *testing.T) {
|
|||||||
e, err := NewRawExporter(withTestCollectorEndpoint())
|
e, err := NewRawExporter(withTestCollectorEndpoint())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
ss := []*export.SpanSnapshot{
|
ss := []*sdktrace.SpanSnapshot{
|
||||||
{
|
{
|
||||||
Name: "s1",
|
Name: "s1",
|
||||||
Resource: resource.NewWithAttributes(
|
Resource: resource.NewWithAttributes(
|
||||||
@@ -694,7 +693,7 @@ func TestExporterExportSpansHonorsTimeout(t *testing.T) {
|
|||||||
e, err := NewRawExporter(withTestCollectorEndpoint())
|
e, err := NewRawExporter(withTestCollectorEndpoint())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
ss := []*export.SpanSnapshot{
|
ss := []*sdktrace.SpanSnapshot{
|
||||||
{
|
{
|
||||||
Name: "s1",
|
Name: "s1",
|
||||||
Resource: resource.NewWithAttributes(
|
Resource: resource.NewWithAttributes(
|
||||||
@@ -730,7 +729,7 @@ func TestJaegerBatchList(t *testing.T) {
|
|||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
spanSnapshotList []*export.SpanSnapshot
|
spanSnapshotList []*sdktrace.SpanSnapshot
|
||||||
defaultServiceName string
|
defaultServiceName string
|
||||||
expectedBatchList []*gen.Batch
|
expectedBatchList []*gen.Batch
|
||||||
}{
|
}{
|
||||||
@@ -741,7 +740,7 @@ func TestJaegerBatchList(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "span's snapshot contains nil span",
|
name: "span's snapshot contains nil span",
|
||||||
spanSnapshotList: []*export.SpanSnapshot{
|
spanSnapshotList: []*sdktrace.SpanSnapshot{
|
||||||
{
|
{
|
||||||
Name: "s1",
|
Name: "s1",
|
||||||
Resource: resource.NewWithAttributes(
|
Resource: resource.NewWithAttributes(
|
||||||
@@ -775,7 +774,7 @@ func TestJaegerBatchList(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "merge spans that have the same resources",
|
name: "merge spans that have the same resources",
|
||||||
spanSnapshotList: []*export.SpanSnapshot{
|
spanSnapshotList: []*sdktrace.SpanSnapshot{
|
||||||
{
|
{
|
||||||
Name: "s1",
|
Name: "s1",
|
||||||
Resource: resource.NewWithAttributes(
|
Resource: resource.NewWithAttributes(
|
||||||
@@ -850,7 +849,7 @@ func TestJaegerBatchList(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no service name in spans",
|
name: "no service name in spans",
|
||||||
spanSnapshotList: []*export.SpanSnapshot{
|
spanSnapshotList: []*sdktrace.SpanSnapshot{
|
||||||
{
|
{
|
||||||
Name: "s1",
|
Name: "s1",
|
||||||
Resource: resource.NewWithAttributes(
|
Resource: resource.NewWithAttributes(
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import (
|
|||||||
zkmodel "github.com/openzipkin/zipkin-go/model"
|
zkmodel "github.com/openzipkin/zipkin-go/model"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/semconv"
|
"go.opentelemetry.io/otel/semconv"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
@@ -32,7 +32,7 @@ const (
|
|||||||
keyInstrumentationLibraryVersion = "otel.instrumentation_library.version"
|
keyInstrumentationLibraryVersion = "otel.instrumentation_library.version"
|
||||||
)
|
)
|
||||||
|
|
||||||
func toZipkinSpanModels(batch []*export.SpanSnapshot) []zkmodel.SpanModel {
|
func toZipkinSpanModels(batch []*tracesdk.SpanSnapshot) []zkmodel.SpanModel {
|
||||||
models := make([]zkmodel.SpanModel, 0, len(batch))
|
models := make([]zkmodel.SpanModel, 0, len(batch))
|
||||||
for _, data := range batch {
|
for _, data := range batch {
|
||||||
models = append(models, toZipkinSpanModel(data))
|
models = append(models, toZipkinSpanModel(data))
|
||||||
@@ -51,7 +51,7 @@ func getServiceName(attrs []attribute.KeyValue) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func toZipkinSpanModel(data *export.SpanSnapshot) zkmodel.SpanModel {
|
func toZipkinSpanModel(data *tracesdk.SpanSnapshot) zkmodel.SpanModel {
|
||||||
return zkmodel.SpanModel{
|
return zkmodel.SpanModel{
|
||||||
SpanContext: toZipkinSpanContext(data),
|
SpanContext: toZipkinSpanContext(data),
|
||||||
Name: data.Name,
|
Name: data.Name,
|
||||||
@@ -68,7 +68,7 @@ func toZipkinSpanModel(data *export.SpanSnapshot) zkmodel.SpanModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func toZipkinSpanContext(data *export.SpanSnapshot) zkmodel.SpanContext {
|
func toZipkinSpanContext(data *tracesdk.SpanSnapshot) zkmodel.SpanContext {
|
||||||
return zkmodel.SpanContext{
|
return zkmodel.SpanContext{
|
||||||
TraceID: toZipkinTraceID(data.SpanContext.TraceID()),
|
TraceID: toZipkinTraceID(data.SpanContext.TraceID()),
|
||||||
ID: toZipkinID(data.SpanContext.SpanID()),
|
ID: toZipkinID(data.SpanContext.SpanID()),
|
||||||
@@ -157,7 +157,7 @@ var extraZipkinTags = []string{
|
|||||||
keyInstrumentationLibraryVersion,
|
keyInstrumentationLibraryVersion,
|
||||||
}
|
}
|
||||||
|
|
||||||
func toZipkinTags(data *export.SpanSnapshot) map[string]string {
|
func toZipkinTags(data *tracesdk.SpanSnapshot) map[string]string {
|
||||||
m := make(map[string]string, len(data.Attributes)+len(extraZipkinTags))
|
m := make(map[string]string, len(data.Attributes)+len(extraZipkinTags))
|
||||||
for _, kv := range data.Attributes {
|
for _, kv := range data.Attributes {
|
||||||
m[(string)(kv.Key)] = kv.Value.Emit()
|
m[(string)(kv.Key)] = kv.Value.Emit()
|
||||||
|
|||||||
@@ -27,9 +27,9 @@ import (
|
|||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/semconv"
|
"go.opentelemetry.io/otel/semconv"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
@@ -39,7 +39,7 @@ func TestModelConversion(t *testing.T) {
|
|||||||
semconv.ServiceNameKey.String("model-test"),
|
semconv.ServiceNameKey.String("model-test"),
|
||||||
)
|
)
|
||||||
|
|
||||||
inputBatch := []*export.SpanSnapshot{
|
inputBatch := []*tracesdk.SpanSnapshot{
|
||||||
// typical span data
|
// typical span data
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
@@ -710,12 +710,12 @@ func Test_toZipkinTags(t *testing.T) {
|
|||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
data *export.SpanSnapshot
|
data *tracesdk.SpanSnapshot
|
||||||
want map[string]string
|
want map[string]string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "attributes",
|
name: "attributes",
|
||||||
data: &export.SpanSnapshot{
|
data: &tracesdk.SpanSnapshot{
|
||||||
Attributes: []attribute.KeyValue{
|
Attributes: []attribute.KeyValue{
|
||||||
attribute.String("key", keyValue),
|
attribute.String("key", keyValue),
|
||||||
attribute.Float64("double", doubleValue),
|
attribute.Float64("double", doubleValue),
|
||||||
@@ -734,7 +734,7 @@ func Test_toZipkinTags(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no attributes",
|
name: "no attributes",
|
||||||
data: &export.SpanSnapshot{},
|
data: &tracesdk.SpanSnapshot{},
|
||||||
want: map[string]string{
|
want: map[string]string{
|
||||||
"otel.status_code": codes.Unset.String(),
|
"otel.status_code": codes.Unset.String(),
|
||||||
"otel.status_description": "",
|
"otel.status_description": "",
|
||||||
@@ -742,7 +742,7 @@ func Test_toZipkinTags(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "omit-noerror",
|
name: "omit-noerror",
|
||||||
data: &export.SpanSnapshot{
|
data: &tracesdk.SpanSnapshot{
|
||||||
Attributes: []attribute.KeyValue{
|
Attributes: []attribute.KeyValue{
|
||||||
attribute.Bool("error", false),
|
attribute.Bool("error", false),
|
||||||
},
|
},
|
||||||
@@ -754,7 +754,7 @@ func Test_toZipkinTags(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "statusCode",
|
name: "statusCode",
|
||||||
data: &export.SpanSnapshot{
|
data: &tracesdk.SpanSnapshot{
|
||||||
Attributes: []attribute.KeyValue{
|
Attributes: []attribute.KeyValue{
|
||||||
attribute.String("key", keyValue),
|
attribute.String("key", keyValue),
|
||||||
attribute.Bool("error", true),
|
attribute.Bool("error", true),
|
||||||
@@ -771,7 +771,7 @@ func Test_toZipkinTags(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "instrLib-empty",
|
name: "instrLib-empty",
|
||||||
data: &export.SpanSnapshot{
|
data: &tracesdk.SpanSnapshot{
|
||||||
InstrumentationLibrary: instrumentation.Library{},
|
InstrumentationLibrary: instrumentation.Library{},
|
||||||
},
|
},
|
||||||
want: map[string]string{
|
want: map[string]string{
|
||||||
@@ -781,7 +781,7 @@ func Test_toZipkinTags(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "instrLib-noversion",
|
name: "instrLib-noversion",
|
||||||
data: &export.SpanSnapshot{
|
data: &tracesdk.SpanSnapshot{
|
||||||
Attributes: []attribute.KeyValue{},
|
Attributes: []attribute.KeyValue{},
|
||||||
InstrumentationLibrary: instrumentation.Library{
|
InstrumentationLibrary: instrumentation.Library{
|
||||||
Name: instrLibName,
|
Name: instrLibName,
|
||||||
@@ -795,7 +795,7 @@ func Test_toZipkinTags(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "instrLib-with-version",
|
name: "instrLib-with-version",
|
||||||
data: &export.SpanSnapshot{
|
data: &tracesdk.SpanSnapshot{
|
||||||
Attributes: []attribute.KeyValue{},
|
Attributes: []attribute.KeyValue{},
|
||||||
InstrumentationLibrary: instrumentation.Library{
|
InstrumentationLibrary: instrumentation.Library{
|
||||||
Name: instrLibName,
|
Name: instrLibName,
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -46,7 +45,7 @@ type Exporter struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ export.SpanExporter = &Exporter{}
|
_ sdktrace.SpanExporter = &Exporter{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Options contains configuration for the exporter.
|
// Options contains configuration for the exporter.
|
||||||
@@ -135,7 +134,7 @@ func InstallNewPipeline(collectorURL string, opts ...Option) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ExportSpans exports SpanSnapshots to a Zipkin receiver.
|
// ExportSpans exports SpanSnapshots to a Zipkin receiver.
|
||||||
func (e *Exporter) ExportSpans(ctx context.Context, ss []*export.SpanSnapshot) error {
|
func (e *Exporter) ExportSpans(ctx context.Context, ss []*sdktrace.SpanSnapshot) error {
|
||||||
e.stoppedMu.RLock()
|
e.stoppedMu.RLock()
|
||||||
stopped := e.stopped
|
stopped := e.stopped
|
||||||
e.stoppedMu.RUnlock()
|
e.stoppedMu.RUnlock()
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import (
|
|||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/semconv"
|
"go.opentelemetry.io/otel/semconv"
|
||||||
@@ -234,7 +233,7 @@ func TestExportSpans(t *testing.T) {
|
|||||||
semconv.ServiceNameKey.String("exporter-test"),
|
semconv.ServiceNameKey.String("exporter-test"),
|
||||||
)
|
)
|
||||||
|
|
||||||
spans := []*export.SpanSnapshot{
|
spans := []*sdktrace.SpanSnapshot{
|
||||||
// parent
|
// parent
|
||||||
{
|
{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -66,13 +65,13 @@ type BatchSpanProcessorOptions struct {
|
|||||||
// batchSpanProcessor is a SpanProcessor that batches asynchronously-received
|
// batchSpanProcessor is a SpanProcessor that batches asynchronously-received
|
||||||
// SpanSnapshots and sends them to a trace.Exporter when complete.
|
// SpanSnapshots and sends them to a trace.Exporter when complete.
|
||||||
type batchSpanProcessor struct {
|
type batchSpanProcessor struct {
|
||||||
e export.SpanExporter
|
e SpanExporter
|
||||||
o BatchSpanProcessorOptions
|
o BatchSpanProcessorOptions
|
||||||
|
|
||||||
queue chan *export.SpanSnapshot
|
queue chan *SpanSnapshot
|
||||||
dropped uint32
|
dropped uint32
|
||||||
|
|
||||||
batch []*export.SpanSnapshot
|
batch []*SpanSnapshot
|
||||||
batchMutex sync.Mutex
|
batchMutex sync.Mutex
|
||||||
timer *time.Timer
|
timer *time.Timer
|
||||||
stopWait sync.WaitGroup
|
stopWait sync.WaitGroup
|
||||||
@@ -86,7 +85,7 @@ var _ SpanProcessor = (*batchSpanProcessor)(nil)
|
|||||||
// span batches to the exporter with the supplied options.
|
// span batches to the exporter with the supplied options.
|
||||||
//
|
//
|
||||||
// If the exporter is nil, the span processor will preform no action.
|
// If the exporter is nil, the span processor will preform no action.
|
||||||
func NewBatchSpanProcessor(exporter export.SpanExporter, options ...BatchSpanProcessorOption) SpanProcessor {
|
func NewBatchSpanProcessor(exporter SpanExporter, options ...BatchSpanProcessorOption) SpanProcessor {
|
||||||
o := BatchSpanProcessorOptions{
|
o := BatchSpanProcessorOptions{
|
||||||
BatchTimeout: DefaultBatchTimeout,
|
BatchTimeout: DefaultBatchTimeout,
|
||||||
ExportTimeout: DefaultExportTimeout,
|
ExportTimeout: DefaultExportTimeout,
|
||||||
@@ -99,9 +98,9 @@ func NewBatchSpanProcessor(exporter export.SpanExporter, options ...BatchSpanPro
|
|||||||
bsp := &batchSpanProcessor{
|
bsp := &batchSpanProcessor{
|
||||||
e: exporter,
|
e: exporter,
|
||||||
o: o,
|
o: o,
|
||||||
batch: make([]*export.SpanSnapshot, 0, o.MaxExportBatchSize),
|
batch: make([]*SpanSnapshot, 0, o.MaxExportBatchSize),
|
||||||
timer: time.NewTimer(o.BatchTimeout),
|
timer: time.NewTimer(o.BatchTimeout),
|
||||||
queue: make(chan *export.SpanSnapshot, o.MaxQueueSize),
|
queue: make(chan *SpanSnapshot, o.MaxQueueSize),
|
||||||
stopCh: make(chan struct{}),
|
stopCh: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -290,7 +289,7 @@ func (bsp *batchSpanProcessor) drainQueue() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bsp *batchSpanProcessor) enqueue(sd *export.SpanSnapshot) {
|
func (bsp *batchSpanProcessor) enqueue(sd *SpanSnapshot) {
|
||||||
if !sd.SpanContext.IsSampled() {
|
if !sd.SpanContext.IsSampled() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,13 +27,12 @@ import (
|
|||||||
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
type testBatchExporter struct {
|
type testBatchExporter struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
spans []*export.SpanSnapshot
|
spans []*sdktrace.SpanSnapshot
|
||||||
sizes []int
|
sizes []int
|
||||||
batchCount int
|
batchCount int
|
||||||
shutdownCount int
|
shutdownCount int
|
||||||
@@ -41,7 +40,7 @@ type testBatchExporter struct {
|
|||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *testBatchExporter) ExportSpans(ctx context.Context, ss []*export.SpanSnapshot) error {
|
func (t *testBatchExporter) ExportSpans(ctx context.Context, ss []*sdktrace.SpanSnapshot) error {
|
||||||
t.mu.Lock()
|
t.mu.Lock()
|
||||||
defer t.mu.Unlock()
|
defer t.mu.Unlock()
|
||||||
|
|
||||||
@@ -77,7 +76,7 @@ func (t *testBatchExporter) getBatchCount() int {
|
|||||||
return t.batchCount
|
return t.batchCount
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ export.SpanExporter = (*testBatchExporter)(nil)
|
var _ sdktrace.SpanExporter = (*testBatchExporter)(nil)
|
||||||
|
|
||||||
func TestNewBatchSpanProcessorWithNilExporter(t *testing.T) {
|
func TestNewBatchSpanProcessorWithNilExporter(t *testing.T) {
|
||||||
tp := basicTracerProvider(t)
|
tp := basicTracerProvider(t)
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import (
|
|||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
)
|
)
|
||||||
@@ -237,13 +236,13 @@ func (p *TracerProvider) Shutdown(ctx context.Context) error {
|
|||||||
|
|
||||||
// WithSyncer registers the exporter with the TracerProvider using a
|
// WithSyncer registers the exporter with the TracerProvider using a
|
||||||
// SimpleSpanProcessor.
|
// SimpleSpanProcessor.
|
||||||
func WithSyncer(e export.SpanExporter) TracerProviderOption {
|
func WithSyncer(e SpanExporter) TracerProviderOption {
|
||||||
return WithSpanProcessor(NewSimpleSpanProcessor(e))
|
return WithSpanProcessor(NewSimpleSpanProcessor(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithBatcher registers the exporter with the TracerProvider using a
|
// WithBatcher registers the exporter with the TracerProvider using a
|
||||||
// BatchSpanProcessor configured with the passed opts.
|
// BatchSpanProcessor configured with the passed opts.
|
||||||
func WithBatcher(e export.SpanExporter, opts ...BatchSpanProcessorOption) TracerProviderOption {
|
func WithBatcher(e SpanExporter, opts ...BatchSpanProcessorOption) TracerProviderOption {
|
||||||
return WithSpanProcessor(NewBatchSpanProcessor(e, opts...))
|
return WithSpanProcessor(NewBatchSpanProcessor(e, opts...))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,14 +19,13 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// simpleSpanProcessor is a SpanProcessor that synchronously sends all
|
// simpleSpanProcessor is a SpanProcessor that synchronously sends all
|
||||||
// completed Spans to a trace.Exporter immediately.
|
// completed Spans to a trace.Exporter immediately.
|
||||||
type simpleSpanProcessor struct {
|
type simpleSpanProcessor struct {
|
||||||
exporterMu sync.RWMutex
|
exporterMu sync.RWMutex
|
||||||
exporter export.SpanExporter
|
exporter SpanExporter
|
||||||
stopOnce sync.Once
|
stopOnce sync.Once
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +33,7 @@ var _ SpanProcessor = (*simpleSpanProcessor)(nil)
|
|||||||
|
|
||||||
// NewSimpleSpanProcessor returns a new SpanProcessor that will synchronously
|
// NewSimpleSpanProcessor returns a new SpanProcessor that will synchronously
|
||||||
// send completed spans to the exporter immediately.
|
// send completed spans to the exporter immediately.
|
||||||
func NewSimpleSpanProcessor(exporter export.SpanExporter) SpanProcessor {
|
func NewSimpleSpanProcessor(exporter SpanExporter) SpanProcessor {
|
||||||
ssp := &simpleSpanProcessor{
|
ssp := &simpleSpanProcessor{
|
||||||
exporter: exporter,
|
exporter: exporter,
|
||||||
}
|
}
|
||||||
@@ -51,7 +50,7 @@ func (ssp *simpleSpanProcessor) OnEnd(s ReadOnlySpan) {
|
|||||||
|
|
||||||
if ssp.exporter != nil && s.SpanContext().TraceFlags().IsSampled() {
|
if ssp.exporter != nil && s.SpanContext().TraceFlags().IsSampled() {
|
||||||
ss := s.Snapshot()
|
ss := s.Snapshot()
|
||||||
if err := ssp.exporter.ExportSpans(context.Background(), []*export.SpanSnapshot{ss}); err != nil {
|
if err := ssp.exporter.ExportSpans(context.Background(), []*SpanSnapshot{ss}); err != nil {
|
||||||
otel.Handle(err)
|
otel.Handle(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import (
|
|||||||
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -30,11 +29,11 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type testExporter struct {
|
type testExporter struct {
|
||||||
spans []*export.SpanSnapshot
|
spans []*sdktrace.SpanSnapshot
|
||||||
shutdown bool
|
shutdown bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *testExporter) ExportSpans(ctx context.Context, ss []*export.SpanSnapshot) error {
|
func (t *testExporter) ExportSpans(ctx context.Context, ss []*sdktrace.SpanSnapshot) error {
|
||||||
t.spans = append(t.spans, ss...)
|
t.spans = append(t.spans, ss...)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -44,7 +43,7 @@ func (t *testExporter) Shutdown(context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ export.SpanExporter = (*testExporter)(nil)
|
var _ sdktrace.SpanExporter = (*testExporter)(nil)
|
||||||
|
|
||||||
func TestNewSimpleSpanProcessor(t *testing.T) {
|
func TestNewSimpleSpanProcessor(t *testing.T) {
|
||||||
if ssp := sdktrace.NewSimpleSpanProcessor(&testExporter{}); ssp == nil {
|
if ssp := sdktrace.NewSimpleSpanProcessor(&testExporter{}); ssp == nil {
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import (
|
|||||||
"go.opentelemetry.io/otel/semconv"
|
"go.opentelemetry.io/otel/semconv"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/internal"
|
"go.opentelemetry.io/otel/sdk/internal"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
@@ -53,7 +52,7 @@ type ReadOnlySpan interface {
|
|||||||
IsRecording() bool
|
IsRecording() bool
|
||||||
InstrumentationLibrary() instrumentation.Library
|
InstrumentationLibrary() instrumentation.Library
|
||||||
Resource() *resource.Resource
|
Resource() *resource.Resource
|
||||||
Snapshot() *export.SpanSnapshot
|
Snapshot() *SpanSnapshot
|
||||||
|
|
||||||
// A private method to prevent users implementing the
|
// A private method to prevent users implementing the
|
||||||
// interface and so future additions to it will not
|
// interface and so future additions to it will not
|
||||||
@@ -430,8 +429,8 @@ func (s *span) addLink(link trace.Link) {
|
|||||||
|
|
||||||
// Snapshot creates a snapshot representing the current state of the span as an
|
// Snapshot creates a snapshot representing the current state of the span as an
|
||||||
// export.SpanSnapshot and returns a pointer to it.
|
// export.SpanSnapshot and returns a pointer to it.
|
||||||
func (s *span) Snapshot() *export.SpanSnapshot {
|
func (s *span) Snapshot() *SpanSnapshot {
|
||||||
var sd export.SpanSnapshot
|
var sd SpanSnapshot
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
@@ -580,3 +579,39 @@ func isRecording(s SamplingResult) bool {
|
|||||||
func isSampled(s SamplingResult) bool {
|
func isSampled(s SamplingResult) bool {
|
||||||
return s.Decision == RecordAndSample
|
return s.Decision == RecordAndSample
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SpanSnapshot is a snapshot of a span which contains all the information
|
||||||
|
// collected by the span. Its main purpose is exporting completed spans.
|
||||||
|
// Although SpanSnapshot fields can be accessed and potentially modified,
|
||||||
|
// SpanSnapshot should be treated as immutable. Changes to the span from which
|
||||||
|
// the SpanSnapshot was created are NOT reflected in the SpanSnapshot.
|
||||||
|
type SpanSnapshot struct {
|
||||||
|
SpanContext trace.SpanContext
|
||||||
|
Parent trace.SpanContext
|
||||||
|
SpanKind trace.SpanKind
|
||||||
|
Name string
|
||||||
|
StartTime time.Time
|
||||||
|
// The wall clock time of EndTime will be adjusted to always be offset
|
||||||
|
// from StartTime by the duration of the span.
|
||||||
|
EndTime time.Time
|
||||||
|
Attributes []attribute.KeyValue
|
||||||
|
MessageEvents []trace.Event
|
||||||
|
Links []trace.Link
|
||||||
|
StatusCode codes.Code
|
||||||
|
StatusMessage string
|
||||||
|
|
||||||
|
// DroppedAttributeCount contains dropped attributes for the span itself.
|
||||||
|
DroppedAttributeCount int
|
||||||
|
DroppedMessageEventCount int
|
||||||
|
DroppedLinkCount int
|
||||||
|
|
||||||
|
// ChildSpanCount holds the number of child span created for this span.
|
||||||
|
ChildSpanCount int
|
||||||
|
|
||||||
|
// Resource contains attributes representing an entity that produced this span.
|
||||||
|
Resource *resource.Resource
|
||||||
|
|
||||||
|
// InstrumentationLibrary defines the instrumentation library used to
|
||||||
|
// provide instrumentation.
|
||||||
|
InstrumentationLibrary instrumentation.Library
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,19 +12,9 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package trace // import "go.opentelemetry.io/otel/sdk/export/trace"
|
package trace // import "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
|
||||||
import (
|
import "context"
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
"go.opentelemetry.io/otel/codes"
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SpanExporter handles the delivery of SpanSnapshot structs to external
|
// SpanExporter handles the delivery of SpanSnapshot structs to external
|
||||||
// receivers. This is the final component in the trace export pipeline.
|
// receivers. This is the final component in the trace export pipeline.
|
||||||
@@ -47,39 +37,3 @@ type SpanExporter interface {
|
|||||||
// the passed context.
|
// the passed context.
|
||||||
Shutdown(ctx context.Context) error
|
Shutdown(ctx context.Context) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// SpanSnapshot is a snapshot of a span which contains all the information
|
|
||||||
// collected by the span. Its main purpose is exporting completed spans.
|
|
||||||
// Although SpanSnapshot fields can be accessed and potentially modified,
|
|
||||||
// SpanSnapshot should be treated as immutable. Changes to the span from which
|
|
||||||
// the SpanSnapshot was created are NOT reflected in the SpanSnapshot.
|
|
||||||
type SpanSnapshot struct {
|
|
||||||
SpanContext trace.SpanContext
|
|
||||||
Parent trace.SpanContext
|
|
||||||
SpanKind trace.SpanKind
|
|
||||||
Name string
|
|
||||||
StartTime time.Time
|
|
||||||
// The wall clock time of EndTime will be adjusted to always be offset
|
|
||||||
// from StartTime by the duration of the span.
|
|
||||||
EndTime time.Time
|
|
||||||
Attributes []attribute.KeyValue
|
|
||||||
MessageEvents []trace.Event
|
|
||||||
Links []trace.Link
|
|
||||||
StatusCode codes.Code
|
|
||||||
StatusMessage string
|
|
||||||
|
|
||||||
// DroppedAttributeCount contains dropped attributes for the span itself.
|
|
||||||
DroppedAttributeCount int
|
|
||||||
DroppedMessageEventCount int
|
|
||||||
DroppedLinkCount int
|
|
||||||
|
|
||||||
// ChildSpanCount holds the number of child span created for this span.
|
|
||||||
ChildSpanCount int
|
|
||||||
|
|
||||||
// Resource contains attributes representing an entity that produced this span.
|
|
||||||
Resource *resource.Resource
|
|
||||||
|
|
||||||
// InstrumentationLibrary defines the instrumentation library used to
|
|
||||||
// provide instrumentation.
|
|
||||||
InstrumentationLibrary instrumentation.Library
|
|
||||||
}
|
|
||||||
@@ -17,8 +17,6 @@ package trace
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/export/trace/tracetest"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// DurationFilter is a SpanProcessor that filters spans that have lifetimes
|
// DurationFilter is a SpanProcessor that filters spans that have lifetimes
|
||||||
@@ -76,8 +74,13 @@ func (f InstrumentationBlacklist) OnEnd(s ReadOnlySpan) {
|
|||||||
f.Next.OnEnd(s)
|
f.Next.OnEnd(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type noopExporter struct{}
|
||||||
|
|
||||||
|
func (noopExporter) ExportSpans(context.Context, []*SpanSnapshot) error { return nil }
|
||||||
|
func (noopExporter) Shutdown(context.Context) error { return nil }
|
||||||
|
|
||||||
func ExampleSpanProcessor() {
|
func ExampleSpanProcessor() {
|
||||||
exportSP := NewSimpleSpanProcessor(tracetest.NewNoopExporter())
|
exportSP := NewSimpleSpanProcessor(noopExporter{})
|
||||||
|
|
||||||
// Build a SpanProcessor chain to filter out all spans from the pernicious
|
// Build a SpanProcessor chain to filter out all spans from the pernicious
|
||||||
// "naughty-instrumentation" dependency and only allow spans shorter than
|
// "naughty-instrumentation" dependency and only allow spans shorter than
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ import (
|
|||||||
|
|
||||||
ottest "go.opentelemetry.io/otel/internal/internaltest"
|
ottest "go.opentelemetry.io/otel/internal/internaltest"
|
||||||
|
|
||||||
export "go.opentelemetry.io/otel/sdk/export/trace"
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
)
|
)
|
||||||
@@ -102,14 +101,14 @@ func TestTracerFollowsExpectedAPIBehaviour(t *testing.T) {
|
|||||||
type testExporter struct {
|
type testExporter struct {
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
idx map[string]int
|
idx map[string]int
|
||||||
spans []*export.SpanSnapshot
|
spans []*SpanSnapshot
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTestExporter() *testExporter {
|
func NewTestExporter() *testExporter {
|
||||||
return &testExporter{idx: make(map[string]int)}
|
return &testExporter{idx: make(map[string]int)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (te *testExporter) ExportSpans(_ context.Context, ss []*export.SpanSnapshot) error {
|
func (te *testExporter) ExportSpans(_ context.Context, ss []*SpanSnapshot) error {
|
||||||
te.mu.Lock()
|
te.mu.Lock()
|
||||||
defer te.mu.Unlock()
|
defer te.mu.Unlock()
|
||||||
|
|
||||||
@@ -122,16 +121,16 @@ func (te *testExporter) ExportSpans(_ context.Context, ss []*export.SpanSnapshot
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (te *testExporter) Spans() []*export.SpanSnapshot {
|
func (te *testExporter) Spans() []*SpanSnapshot {
|
||||||
te.mu.RLock()
|
te.mu.RLock()
|
||||||
defer te.mu.RUnlock()
|
defer te.mu.RUnlock()
|
||||||
|
|
||||||
cp := make([]*export.SpanSnapshot, len(te.spans))
|
cp := make([]*SpanSnapshot, len(te.spans))
|
||||||
copy(cp, te.spans)
|
copy(cp, te.spans)
|
||||||
return cp
|
return cp
|
||||||
}
|
}
|
||||||
|
|
||||||
func (te *testExporter) GetSpan(name string) (*export.SpanSnapshot, bool) {
|
func (te *testExporter) GetSpan(name string) (*SpanSnapshot, bool) {
|
||||||
te.mu.RLock()
|
te.mu.RLock()
|
||||||
defer te.mu.RUnlock()
|
defer te.mu.RUnlock()
|
||||||
i, ok := te.idx[name]
|
i, ok := te.idx[name]
|
||||||
@@ -388,7 +387,7 @@ func TestSetSpanAttributesOnStart(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -417,7 +416,7 @@ func TestSetSpanAttributes(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -473,7 +472,7 @@ func TestSetSpanAttributesOverLimit(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -507,7 +506,7 @@ func TestSetSpanAttributesWithInvalidKey(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -551,7 +550,7 @@ func TestEvents(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -600,7 +599,7 @@ func TestEventsOverLimit(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -642,7 +641,7 @@ func TestLinks(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -683,7 +682,7 @@ func TestLinksOverLimit(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -732,7 +731,7 @@ func TestSetSpanStatus(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -760,7 +759,7 @@ func TestSetSpanStatusWithoutMessageWhenStatusIsNotError(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -847,7 +846,7 @@ func startLocalSpan(tp *TracerProvider, ctx context.Context, trName, name string
|
|||||||
// It also does some basic tests on the span.
|
// It also does some basic tests on the span.
|
||||||
// It also clears spanID in the export.SpanSnapshot to make the comparison
|
// It also clears spanID in the export.SpanSnapshot to make the comparison
|
||||||
// easier.
|
// easier.
|
||||||
func endSpan(te *testExporter, span trace.Span) (*export.SpanSnapshot, error) {
|
func endSpan(te *testExporter, span trace.Span) (*SpanSnapshot, error) {
|
||||||
if !span.IsRecording() {
|
if !span.IsRecording() {
|
||||||
return nil, fmt.Errorf("IsRecording: got false, want true")
|
return nil, fmt.Errorf("IsRecording: got false, want true")
|
||||||
}
|
}
|
||||||
@@ -1109,7 +1108,7 @@ func TestRecordError(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -1148,7 +1147,7 @@ func TestRecordErrorNil(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -1245,7 +1244,7 @@ func TestWithResource(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err.Error())
|
t.Error(err.Error())
|
||||||
}
|
}
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -1281,7 +1280,7 @@ func TestWithInstrumentationVersion(t *testing.T) {
|
|||||||
t.Error(err.Error())
|
t.Error(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -1469,7 +1468,7 @@ func TestAddEventsWithMoreAttributesThanLimit(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
@@ -1528,7 +1527,7 @@ func TestAddLinksWithMoreAttributesThanLimit(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
want := &export.SpanSnapshot{
|
want := &SpanSnapshot{
|
||||||
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
SpanContext: trace.NewSpanContext(trace.SpanContextConfig{
|
||||||
TraceID: tid,
|
TraceID: tid,
|
||||||
TraceFlags: 0x1,
|
TraceFlags: 0x1,
|
||||||
|
|||||||
@@ -12,15 +12,16 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
// Package tracetest is a testing helper package for the SDK. User can configure no-op or in-memory exporters to verify
|
// Package tracetest is a testing helper package for the SDK. User can
|
||||||
// different SDK behaviors or custom instrumentation.
|
// configure no-op or in-memory exporters to verify different SDK behaviors or
|
||||||
package tracetest // import "go.opentelemetry.io/otel/sdk/export/trace/tracetest"
|
// custom instrumentation.
|
||||||
|
package tracetest // import "go.opentelemetry.io/otel/sdk/trace/tracetest"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/export/trace"
|
"go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ trace.SpanExporter = (*NoopExporter)(nil)
|
var _ trace.SpanExporter = (*NoopExporter)(nil)
|
||||||
@@ -21,7 +21,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/export/trace"
|
"go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TestNoop tests only that the no-op does not crash in different scenarios.
|
// TestNoop tests only that the no-op does not crash in different scenarios.
|
||||||
Reference in New Issue
Block a user