You've already forked opentelemetry-go
mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-11-23 22:34:47 +02:00
WithInstrumentationAttributes is creating a closure with a reference to a slice which is later passed to attribute.NewSet. attribute.NewSet may mutate the slice, so this will lead to a data race when the option is applied concurrently. We can fix this by moving the call to attribute.NewSet outside the closure. Fixes #7217 <details> <summary>benchstat for New*Config</summary> ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/log cpu: Intel(R) Core(TM) Ultra 7 155U │ /tmp/old.txt │ /tmp/new.txt │ │ sec/op │ sec/op vs base │ NewLoggerConfig/with_no_options-14 2.961n ± 6% 3.091n ± 6% ~ (p=0.132 n=6) NewLoggerConfig/with_an_instrumentation_version-14 24.75n ± 4% 25.04n ± 5% ~ (p=0.126 n=6) NewLoggerConfig/with_a_schema_url-14 24.97n ± 6% 24.79n ± 4% ~ (p=0.974 n=6) NewLoggerConfig/with_instrumentation_attribute-14 55.32n ± 4% 25.32n ± 4% -54.23% (p=0.002 n=6) NewLoggerConfig/with_instrumentation_attribute_set-14 24.77n ± 3% 24.96n ± 4% ~ (p=0.394 n=6) geomean 19.05n 16.47n -13.52% │ /tmp/old.txt │ /tmp/new.txt │ │ B/op │ B/op vs base │ NewLoggerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_instrumentation_attribute-14 64.00 ± 0% 0.00 ± 0% -100.00% (p=0.002 n=6) NewLoggerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean │ /tmp/old.txt │ /tmp/new.txt │ │ allocs/op │ allocs/op vs base │ NewLoggerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_instrumentation_attribute-14 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.002 n=6) NewLoggerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean pkg: go.opentelemetry.io/otel/metric │ /tmp/old.txt │ /tmp/new.txt │ │ sec/op │ sec/op vs base │ NewMeterConfig/with_no_options-14 3.255n ± 2% 3.045n ± 4% -6.42% (p=0.002 n=6) NewMeterConfig/with_an_instrumentation_version-14 22.84n ± 6% 23.14n ± 3% ~ (p=0.818 n=6) NewMeterConfig/with_a_schema_url-14 24.71n ± 5% 25.29n ± 4% ~ (p=0.132 n=6) NewMeterConfig/with_instrumentation_attribute-14 61.30n ± 5% 25.36n ± 7% -58.63% (p=0.002 n=6) NewMeterConfig/with_instrumentation_attribute_set-14 25.93n ± 5% 26.24n ± 4% ~ (p=0.485 n=6) geomean 19.64n 16.40n -16.49% │ /tmp/old.txt │ /tmp/new.txt │ │ B/op │ B/op vs base │ NewMeterConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_instrumentation_attribute-14 64.00 ± 0% 0.00 ± 0% -100.00% (p=0.002 n=6) NewMeterConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean │ /tmp/old.txt │ /tmp/new.txt │ │ allocs/op │ allocs/op vs base │ NewMeterConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_instrumentation_attribute-14 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.002 n=6) NewMeterConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean pkg: go.opentelemetry.io/otel/trace │ /tmp/old.txt │ /tmp/new.txt │ │ sec/op │ sec/op vs base │ NewTracerConfig/with_no_options-14 2.980n ± 5% 2.948n ± 3% ~ (p=0.240 n=6) NewTracerConfig/with_an_instrumentation_version-14 24.44n ± 4% 23.54n ± 1% -3.70% (p=0.002 n=6) NewTracerConfig/with_a_schema_url-14 24.47n ± 5% 23.95n ± 7% ~ (p=0.180 n=6) NewTracerConfig/with_instrumentation_attribute-14 58.39n ± 7% 25.54n ± 6% -56.25% (p=0.002 n=6) NewTracerConfig/with_instrumentation_attribute_set-14 25.70n ± 3% 26.55n ± 6% ~ (p=0.310 n=6) NewSpanStartConfig/with_no_options-14 2.670n ± 7% 2.838n ± 6% ~ (p=0.093 n=6) NewSpanStartConfig/with_attributes-14 60.65n ± 20% 51.84n ± 8% ~ (p=0.240 n=6) NewSpanStartConfig/with_attributes_set_multiple_times-14 115.4n ± 10% 110.0n ± 7% -4.68% (p=0.004 n=6) NewSpanStartConfig/with_a_timestamp-14 18.03n ± 3% 17.77n ± 4% ~ (p=0.937 n=6) NewSpanStartConfig/with_links-14 66.63n ± 8% 75.60n ± 8% +13.47% (p=0.009 n=6) NewSpanStartConfig/with_links_set_multiple_times-14 155.2n ± 4% 162.8n ± 18% ~ (p=0.485 n=6) NewSpanStartConfig/with_new_root-14 26.59n ± 19% 23.04n ± 4% -13.32% (p=0.004 n=6) NewSpanStartConfig/with_span_kind-14 24.02n ± 4% 23.72n ± 9% ~ (p=0.589 n=6) NewSpanEndConfig/with_no_options-14 2.673n ± 10% 2.765n ± 7% ~ (p=0.485 n=6) NewSpanEndConfig/with_a_timestamp-14 17.37n ± 9% 18.04n ± 4% ~ (p=0.093 n=6) NewSpanEndConfig/with_stack_trace-14 16.70n ± 3% 16.59n ± 4% ~ (p=0.937 n=6) NewEventConfig/with_no_options-14 37.14n ± 6% 36.63n ± 3% ~ (p=0.818 n=6) NewEventConfig/with_attributes-14 117.15n ± 9% 98.92n ± 14% -15.56% (p=0.009 n=6) NewEventConfig/with_attributes_set_multiple_times-14 172.6n ± 5% 168.1n ± 9% ~ (p=0.333 n=6) NewEventConfig/with_a_timestamp-14 25.41n ± 3% 26.66n ± 3% +4.92% (p=0.002 n=6) NewEventConfig/with_a_stacktrace-14 51.01n ± 15% 52.45n ± 2% ~ (p=0.093 n=6) geomean 28.82n 27.38n -4.98% │ /tmp/old.txt │ /tmp/new.txt │ │ B/op │ B/op vs base │ NewTracerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_instrumentation_attribute-14 64.00 ± 0% 0.00 ± 0% -100.00% (p=0.002 n=6) NewTracerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes-14 64.00 ± 0% 64.00 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes_set_multiple_times-14 192.0 ± 0% 192.0 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links-14 96.00 ± 0% 96.00 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links_set_multiple_times-14 272.0 ± 0% 272.0 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_new_root-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_span_kind-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_stack_trace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes-14 64.00 ± 0% 64.00 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes_set_multiple_times-14 192.0 ± 0% 192.0 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_stacktrace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean │ /tmp/old.txt │ /tmp/new.txt │ │ allocs/op │ allocs/op vs base │ NewTracerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_instrumentation_attribute-14 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.002 n=6) NewTracerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes-14 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes_set_multiple_times-14 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links-14 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links_set_multiple_times-14 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_new_root-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_span_kind-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_stack_trace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes-14 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes_set_multiple_times-14 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_stacktrace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean ``` </details> --------- Co-authored-by: Robert Pająk <pellared@hotmail.com> Co-authored-by: Flc゛ <four_leaf_clover@foxmail.com> Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
363 lines
11 KiB
Go
363 lines
11 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package trace // import "go.opentelemetry.io/otel/trace"
|
|
|
|
import (
|
|
"slices"
|
|
"time"
|
|
|
|
"go.opentelemetry.io/otel/attribute"
|
|
)
|
|
|
|
// TracerConfig is a group of options for a Tracer.
|
|
type TracerConfig struct {
|
|
instrumentationVersion string
|
|
// Schema URL of the telemetry emitted by the Tracer.
|
|
schemaURL string
|
|
attrs attribute.Set
|
|
}
|
|
|
|
// InstrumentationVersion returns the version of the library providing instrumentation.
|
|
func (t *TracerConfig) InstrumentationVersion() string {
|
|
return t.instrumentationVersion
|
|
}
|
|
|
|
// InstrumentationAttributes returns the attributes associated with the library
|
|
// providing instrumentation.
|
|
func (t *TracerConfig) InstrumentationAttributes() attribute.Set {
|
|
return t.attrs
|
|
}
|
|
|
|
// SchemaURL returns the Schema URL of the telemetry emitted by the Tracer.
|
|
func (t *TracerConfig) SchemaURL() string {
|
|
return t.schemaURL
|
|
}
|
|
|
|
// NewTracerConfig applies all the options to a returned TracerConfig.
|
|
func NewTracerConfig(options ...TracerOption) TracerConfig {
|
|
var config TracerConfig
|
|
for _, option := range options {
|
|
config = option.apply(config)
|
|
}
|
|
return config
|
|
}
|
|
|
|
// TracerOption applies an option to a TracerConfig.
|
|
type TracerOption interface {
|
|
apply(TracerConfig) TracerConfig
|
|
}
|
|
|
|
type tracerOptionFunc func(TracerConfig) TracerConfig
|
|
|
|
func (fn tracerOptionFunc) apply(cfg TracerConfig) TracerConfig {
|
|
return fn(cfg)
|
|
}
|
|
|
|
// SpanConfig is a group of options for a Span.
|
|
type SpanConfig struct {
|
|
attributes []attribute.KeyValue
|
|
timestamp time.Time
|
|
links []Link
|
|
newRoot bool
|
|
spanKind SpanKind
|
|
stackTrace bool
|
|
}
|
|
|
|
// Attributes describe the associated qualities of a Span.
|
|
func (cfg *SpanConfig) Attributes() []attribute.KeyValue {
|
|
return cfg.attributes
|
|
}
|
|
|
|
// Timestamp is a time in a Span life-cycle.
|
|
func (cfg *SpanConfig) Timestamp() time.Time {
|
|
return cfg.timestamp
|
|
}
|
|
|
|
// StackTrace reports whether stack trace capturing is enabled.
|
|
func (cfg *SpanConfig) StackTrace() bool {
|
|
return cfg.stackTrace
|
|
}
|
|
|
|
// Links are the associations a Span has with other Spans.
|
|
func (cfg *SpanConfig) Links() []Link {
|
|
return cfg.links
|
|
}
|
|
|
|
// NewRoot identifies a Span as the root Span for a new trace. This is
|
|
// commonly used when an existing trace crosses trust boundaries and the
|
|
// remote parent span context should be ignored for security.
|
|
func (cfg *SpanConfig) NewRoot() bool {
|
|
return cfg.newRoot
|
|
}
|
|
|
|
// SpanKind is the role a Span has in a trace.
|
|
func (cfg *SpanConfig) SpanKind() SpanKind {
|
|
return cfg.spanKind
|
|
}
|
|
|
|
// NewSpanStartConfig applies all the options to a returned SpanConfig.
|
|
// No validation is performed on the returned SpanConfig (e.g. no uniqueness
|
|
// checking or bounding of data), it is left to the SDK to perform this
|
|
// action.
|
|
func NewSpanStartConfig(options ...SpanStartOption) SpanConfig {
|
|
var c SpanConfig
|
|
for _, option := range options {
|
|
c = option.applySpanStart(c)
|
|
}
|
|
return c
|
|
}
|
|
|
|
// NewSpanEndConfig applies all the options to a returned SpanConfig.
|
|
// No validation is performed on the returned SpanConfig (e.g. no uniqueness
|
|
// checking or bounding of data), it is left to the SDK to perform this
|
|
// action.
|
|
func NewSpanEndConfig(options ...SpanEndOption) SpanConfig {
|
|
var c SpanConfig
|
|
for _, option := range options {
|
|
c = option.applySpanEnd(c)
|
|
}
|
|
return c
|
|
}
|
|
|
|
// SpanStartOption applies an option to a SpanConfig. These options are applicable
|
|
// only when the span is created.
|
|
type SpanStartOption interface {
|
|
applySpanStart(SpanConfig) SpanConfig
|
|
}
|
|
|
|
type spanOptionFunc func(SpanConfig) SpanConfig
|
|
|
|
func (fn spanOptionFunc) applySpanStart(cfg SpanConfig) SpanConfig {
|
|
return fn(cfg)
|
|
}
|
|
|
|
// SpanEndOption applies an option to a SpanConfig. These options are
|
|
// applicable only when the span is ended.
|
|
type SpanEndOption interface {
|
|
applySpanEnd(SpanConfig) SpanConfig
|
|
}
|
|
|
|
// EventConfig is a group of options for an Event.
|
|
type EventConfig struct {
|
|
attributes []attribute.KeyValue
|
|
timestamp time.Time
|
|
stackTrace bool
|
|
}
|
|
|
|
// Attributes describe the associated qualities of an Event.
|
|
func (cfg *EventConfig) Attributes() []attribute.KeyValue {
|
|
return cfg.attributes
|
|
}
|
|
|
|
// Timestamp is a time in an Event life-cycle.
|
|
func (cfg *EventConfig) Timestamp() time.Time {
|
|
return cfg.timestamp
|
|
}
|
|
|
|
// StackTrace reports whether stack trace capturing is enabled.
|
|
func (cfg *EventConfig) StackTrace() bool {
|
|
return cfg.stackTrace
|
|
}
|
|
|
|
// NewEventConfig applies all the EventOptions to a returned EventConfig. If no
|
|
// timestamp option is passed, the returned EventConfig will have a Timestamp
|
|
// set to the call time, otherwise no validation is performed on the returned
|
|
// EventConfig.
|
|
func NewEventConfig(options ...EventOption) EventConfig {
|
|
var c EventConfig
|
|
for _, option := range options {
|
|
c = option.applyEvent(c)
|
|
}
|
|
if c.timestamp.IsZero() {
|
|
c.timestamp = time.Now()
|
|
}
|
|
return c
|
|
}
|
|
|
|
// EventOption applies span event options to an EventConfig.
|
|
type EventOption interface {
|
|
applyEvent(EventConfig) EventConfig
|
|
}
|
|
|
|
// SpanOption are options that can be used at both the beginning and end of a span.
|
|
type SpanOption interface {
|
|
SpanStartOption
|
|
SpanEndOption
|
|
}
|
|
|
|
// SpanStartEventOption are options that can be used at the start of a span, or with an event.
|
|
type SpanStartEventOption interface {
|
|
SpanStartOption
|
|
EventOption
|
|
}
|
|
|
|
// SpanEndEventOption are options that can be used at the end of a span, or with an event.
|
|
type SpanEndEventOption interface {
|
|
SpanEndOption
|
|
EventOption
|
|
}
|
|
|
|
type attributeOption []attribute.KeyValue
|
|
|
|
func (o attributeOption) applySpan(c SpanConfig) SpanConfig {
|
|
c.attributes = append(c.attributes, []attribute.KeyValue(o)...)
|
|
return c
|
|
}
|
|
func (o attributeOption) applySpanStart(c SpanConfig) SpanConfig { return o.applySpan(c) }
|
|
func (o attributeOption) applyEvent(c EventConfig) EventConfig {
|
|
c.attributes = append(c.attributes, []attribute.KeyValue(o)...)
|
|
return c
|
|
}
|
|
|
|
var _ SpanStartEventOption = attributeOption{}
|
|
|
|
// WithAttributes adds the attributes related to a span life-cycle event.
|
|
// These attributes are used to describe the work a Span represents when this
|
|
// option is provided to a Span's start event. Otherwise, these
|
|
// attributes provide additional information about the event being recorded
|
|
// (e.g. error, state change, processing progress, system event).
|
|
//
|
|
// If multiple of these options are passed the attributes of each successive
|
|
// option will extend the attributes instead of overwriting. There is no
|
|
// guarantee of uniqueness in the resulting attributes.
|
|
func WithAttributes(attributes ...attribute.KeyValue) SpanStartEventOption {
|
|
return attributeOption(attributes)
|
|
}
|
|
|
|
// SpanEventOption are options that can be used with an event or a span.
|
|
type SpanEventOption interface {
|
|
SpanOption
|
|
EventOption
|
|
}
|
|
|
|
type timestampOption time.Time
|
|
|
|
func (o timestampOption) applySpan(c SpanConfig) SpanConfig {
|
|
c.timestamp = time.Time(o)
|
|
return c
|
|
}
|
|
func (o timestampOption) applySpanStart(c SpanConfig) SpanConfig { return o.applySpan(c) }
|
|
func (o timestampOption) applySpanEnd(c SpanConfig) SpanConfig { return o.applySpan(c) }
|
|
func (o timestampOption) applyEvent(c EventConfig) EventConfig {
|
|
c.timestamp = time.Time(o)
|
|
return c
|
|
}
|
|
|
|
var _ SpanEventOption = timestampOption{}
|
|
|
|
// WithTimestamp sets the time of a Span or Event life-cycle moment (e.g.
|
|
// started, stopped, errored).
|
|
func WithTimestamp(t time.Time) SpanEventOption {
|
|
return timestampOption(t)
|
|
}
|
|
|
|
type stackTraceOption bool
|
|
|
|
func (o stackTraceOption) applyEvent(c EventConfig) EventConfig {
|
|
c.stackTrace = bool(o)
|
|
return c
|
|
}
|
|
|
|
func (o stackTraceOption) applySpan(c SpanConfig) SpanConfig {
|
|
c.stackTrace = bool(o)
|
|
return c
|
|
}
|
|
func (o stackTraceOption) applySpanEnd(c SpanConfig) SpanConfig { return o.applySpan(c) }
|
|
|
|
// WithStackTrace sets the flag to capture the error with stack trace (e.g. true, false).
|
|
func WithStackTrace(b bool) SpanEndEventOption {
|
|
return stackTraceOption(b)
|
|
}
|
|
|
|
// WithLinks adds links to a Span. The links are added to the existing Span
|
|
// links, i.e. this does not overwrite. Links with invalid span context are ignored.
|
|
func WithLinks(links ...Link) SpanStartOption {
|
|
return spanOptionFunc(func(cfg SpanConfig) SpanConfig {
|
|
cfg.links = append(cfg.links, links...)
|
|
return cfg
|
|
})
|
|
}
|
|
|
|
// WithNewRoot specifies that the Span should be treated as a root Span. Any
|
|
// existing parent span context will be ignored when defining the Span's trace
|
|
// identifiers.
|
|
func WithNewRoot() SpanStartOption {
|
|
return spanOptionFunc(func(cfg SpanConfig) SpanConfig {
|
|
cfg.newRoot = true
|
|
return cfg
|
|
})
|
|
}
|
|
|
|
// WithSpanKind sets the SpanKind of a Span.
|
|
func WithSpanKind(kind SpanKind) SpanStartOption {
|
|
return spanOptionFunc(func(cfg SpanConfig) SpanConfig {
|
|
cfg.spanKind = kind
|
|
return cfg
|
|
})
|
|
}
|
|
|
|
// WithInstrumentationVersion sets the instrumentation version.
|
|
func WithInstrumentationVersion(version string) TracerOption {
|
|
return tracerOptionFunc(func(cfg TracerConfig) TracerConfig {
|
|
cfg.instrumentationVersion = version
|
|
return cfg
|
|
})
|
|
}
|
|
|
|
// mergeSets returns the union of keys between a and b. Any duplicate keys will
|
|
// use the value associated with b.
|
|
func mergeSets(a, b attribute.Set) attribute.Set {
|
|
// NewMergeIterator uses the first value for any duplicates.
|
|
iter := attribute.NewMergeIterator(&b, &a)
|
|
merged := make([]attribute.KeyValue, 0, a.Len()+b.Len())
|
|
for iter.Next() {
|
|
merged = append(merged, iter.Attribute())
|
|
}
|
|
return attribute.NewSet(merged...)
|
|
}
|
|
|
|
// WithInstrumentationAttributes adds the instrumentation attributes.
|
|
//
|
|
// This is equivalent to calling [WithInstrumentationAttributeSet] with an
|
|
// [attribute.Set] created from a clone of the passed attributes.
|
|
// [WithInstrumentationAttributeSet] is recommended for more control.
|
|
//
|
|
// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet]
|
|
// options are passed, the attributes will be merged together in the order
|
|
// they are passed. Attributes with duplicate keys will use the last value passed.
|
|
func WithInstrumentationAttributes(attr ...attribute.KeyValue) TracerOption {
|
|
set := attribute.NewSet(slices.Clone(attr)...)
|
|
return WithInstrumentationAttributeSet(set)
|
|
}
|
|
|
|
// WithInstrumentationAttributeSet adds the instrumentation attributes.
|
|
//
|
|
// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet]
|
|
// options are passed, the attributes will be merged together in the order
|
|
// they are passed. Attributes with duplicate keys will use the last value passed.
|
|
func WithInstrumentationAttributeSet(set attribute.Set) TracerOption {
|
|
if set.Len() == 0 {
|
|
return tracerOptionFunc(func(config TracerConfig) TracerConfig {
|
|
return config
|
|
})
|
|
}
|
|
|
|
return tracerOptionFunc(func(config TracerConfig) TracerConfig {
|
|
if config.attrs.Len() == 0 {
|
|
config.attrs = set
|
|
} else {
|
|
config.attrs = mergeSets(config.attrs, set)
|
|
}
|
|
return config
|
|
})
|
|
}
|
|
|
|
// WithSchemaURL sets the schema URL for the Tracer.
|
|
func WithSchemaURL(schemaURL string) TracerOption {
|
|
return tracerOptionFunc(func(cfg TracerConfig) TracerConfig {
|
|
cfg.schemaURL = schemaURL
|
|
return cfg
|
|
})
|
|
}
|