mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-01-12 02:28:07 +02:00
818c7b14b3
* Update metric Kind to InstrumentKind * Update all the other modules with Kind rename * Update metric Descriptor with instrument Kind rename * Update other modules with Descriptor method rename * Update OTLP exporter test field name * Rename kind filenames * Add changes to CHANGELOG * Fix documentation for Grouping and PrecomputedSum * Rename meter.go to metric.go * Move descriptor.go into metric.go * Move must.go into metric.go * Move instruments into metric_instrument.go * Rename metric api_test.go to metric_test.go * Move instrumentkind_test.go into metric_test.go * Rename sdkapi.go metric_sdkapi.go * Move api/metric into otel * Update to use moved packages * Rename otel.go to error_handler.go * Add changes to CHANGELOG * Fix merge conflict resolution error
295 lines
8.9 KiB
Go
295 lines
8.9 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package otel
|
|
|
|
import (
|
|
"time"
|
|
|
|
"go.opentelemetry.io/otel/label"
|
|
"go.opentelemetry.io/otel/unit"
|
|
)
|
|
|
|
// TracerConfig is a group of options for a Tracer.
|
|
type TracerConfig struct {
|
|
// InstrumentationVersion is the version of the library providing
|
|
// instrumentation.
|
|
InstrumentationVersion string
|
|
}
|
|
|
|
// NewTracerConfig applies all the options to a returned TracerConfig.
|
|
func NewTracerConfig(options ...TracerOption) *TracerConfig {
|
|
config := new(TracerConfig)
|
|
for _, option := range options {
|
|
option.ApplyTracer(config)
|
|
}
|
|
return config
|
|
}
|
|
|
|
// TracerOption applies an option to a TracerConfig.
|
|
type TracerOption interface {
|
|
ApplyTracer(*TracerConfig)
|
|
}
|
|
|
|
// SpanConfig is a group of options for a Span.
|
|
type SpanConfig struct {
|
|
// Attributes describe the associated qualities of a Span.
|
|
Attributes []label.KeyValue
|
|
// Timestamp is a time in a Span life-cycle.
|
|
Timestamp time.Time
|
|
// Links are the associations a Span has with other Spans.
|
|
Links []Link
|
|
// Record is the recording state of a Span.
|
|
Record bool
|
|
// 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.
|
|
NewRoot bool
|
|
// SpanKind is the role a Span has in a trace.
|
|
SpanKind SpanKind
|
|
}
|
|
|
|
// NewSpanConfig 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 NewSpanConfig(options ...SpanOption) *SpanConfig {
|
|
c := new(SpanConfig)
|
|
for _, option := range options {
|
|
option.ApplySpan(c)
|
|
}
|
|
return c
|
|
}
|
|
|
|
// SpanOption applies an option to a SpanConfig.
|
|
type SpanOption interface {
|
|
ApplySpan(*SpanConfig)
|
|
}
|
|
|
|
// NewEventConfig applies all the EventOptions to a returned SpanConfig. If no
|
|
// timestamp option is passed, the returned SpanConfig will have a Timestamp
|
|
// set to the call time, otherwise no validation is performed on the returned
|
|
// SpanConfig.
|
|
func NewEventConfig(options ...EventOption) *SpanConfig {
|
|
c := new(SpanConfig)
|
|
for _, option := range options {
|
|
option.ApplyEvent(c)
|
|
}
|
|
if c.Timestamp.IsZero() {
|
|
c.Timestamp = time.Now()
|
|
}
|
|
return c
|
|
}
|
|
|
|
// EventOption applies span event options to a SpanConfig.
|
|
type EventOption interface {
|
|
ApplyEvent(*SpanConfig)
|
|
}
|
|
|
|
// LifeCycleOption applies span life-cycle options to a SpanConfig. These
|
|
// options set values releated to events in a spans life-cycle like starting,
|
|
// ending, experiencing an error and other user defined notable events.
|
|
type LifeCycleOption interface {
|
|
SpanOption
|
|
EventOption
|
|
}
|
|
|
|
type attributeSpanOption []label.KeyValue
|
|
|
|
func (o attributeSpanOption) ApplySpan(c *SpanConfig) { o.apply(c) }
|
|
func (o attributeSpanOption) ApplyEvent(c *SpanConfig) { o.apply(c) }
|
|
func (o attributeSpanOption) apply(c *SpanConfig) {
|
|
c.Attributes = append(c.Attributes, []label.KeyValue(o)...)
|
|
}
|
|
|
|
// 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 or end events. 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 ...label.KeyValue) LifeCycleOption {
|
|
return attributeSpanOption(attributes)
|
|
}
|
|
|
|
type timestampSpanOption time.Time
|
|
|
|
func (o timestampSpanOption) ApplySpan(c *SpanConfig) { o.apply(c) }
|
|
func (o timestampSpanOption) ApplyEvent(c *SpanConfig) { o.apply(c) }
|
|
func (o timestampSpanOption) apply(c *SpanConfig) { c.Timestamp = time.Time(o) }
|
|
|
|
// WithTimestamp sets the time of a Span life-cycle moment (e.g. started,
|
|
// stopped, errored).
|
|
func WithTimestamp(t time.Time) LifeCycleOption {
|
|
return timestampSpanOption(t)
|
|
}
|
|
|
|
type linksSpanOption []Link
|
|
|
|
func (o linksSpanOption) ApplySpan(c *SpanConfig) { c.Links = append(c.Links, []Link(o)...) }
|
|
|
|
// WithLinks adds links to a Span. The links are added to the existing Span
|
|
// links, i.e. this does not overwrite.
|
|
func WithLinks(links ...Link) SpanOption {
|
|
return linksSpanOption(links)
|
|
}
|
|
|
|
type recordSpanOption bool
|
|
|
|
func (o recordSpanOption) ApplySpan(c *SpanConfig) { c.Record = bool(o) }
|
|
|
|
// WithRecord specifies that the span should be recorded. It is important to
|
|
// note that implementations may override this option, i.e. if the span is a
|
|
// child of an un-sampled trace.
|
|
func WithRecord() SpanOption {
|
|
return recordSpanOption(true)
|
|
}
|
|
|
|
type newRootSpanOption bool
|
|
|
|
func (o newRootSpanOption) ApplySpan(c *SpanConfig) { c.NewRoot = bool(o) }
|
|
|
|
// 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() SpanOption {
|
|
return newRootSpanOption(true)
|
|
}
|
|
|
|
type spanKindSpanOption SpanKind
|
|
|
|
func (o spanKindSpanOption) ApplySpan(c *SpanConfig) { c.SpanKind = SpanKind(o) }
|
|
|
|
// WithSpanKind sets the SpanKind of a Span.
|
|
func WithSpanKind(kind SpanKind) SpanOption {
|
|
return spanKindSpanOption(kind)
|
|
}
|
|
|
|
// InstrumentConfig contains options for metric instrument descriptors.
|
|
type InstrumentConfig struct {
|
|
// Description describes the instrument in human-readable terms.
|
|
Description string
|
|
// Unit describes the measurement unit for a instrument.
|
|
Unit unit.Unit
|
|
// InstrumentationName is the name of the library providing
|
|
// instrumentation.
|
|
InstrumentationName string
|
|
// InstrumentationVersion is the version of the library providing
|
|
// instrumentation.
|
|
InstrumentationVersion string
|
|
}
|
|
|
|
// InstrumentOption is an interface for applying metric instrument options.
|
|
type InstrumentOption interface {
|
|
// ApplyMeter is used to set a InstrumentOption value of a
|
|
// InstrumentConfig.
|
|
ApplyInstrument(*InstrumentConfig)
|
|
}
|
|
|
|
// NewInstrumentConfig creates a new InstrumentConfig
|
|
// and applies all the given options.
|
|
func NewInstrumentConfig(opts ...InstrumentOption) InstrumentConfig {
|
|
var config InstrumentConfig
|
|
for _, o := range opts {
|
|
o.ApplyInstrument(&config)
|
|
}
|
|
return config
|
|
}
|
|
|
|
// WithDescription applies provided description.
|
|
func WithDescription(desc string) InstrumentOption {
|
|
return descriptionOption(desc)
|
|
}
|
|
|
|
type descriptionOption string
|
|
|
|
func (d descriptionOption) ApplyInstrument(config *InstrumentConfig) {
|
|
config.Description = string(d)
|
|
}
|
|
|
|
// WithUnit applies provided unit.
|
|
func WithUnit(unit unit.Unit) InstrumentOption {
|
|
return unitOption(unit)
|
|
}
|
|
|
|
type unitOption unit.Unit
|
|
|
|
func (u unitOption) ApplyInstrument(config *InstrumentConfig) {
|
|
config.Unit = unit.Unit(u)
|
|
}
|
|
|
|
// WithInstrumentationName sets the instrumentation name.
|
|
func WithInstrumentationName(name string) InstrumentOption {
|
|
return instrumentationNameOption(name)
|
|
}
|
|
|
|
type instrumentationNameOption string
|
|
|
|
func (i instrumentationNameOption) ApplyInstrument(config *InstrumentConfig) {
|
|
config.InstrumentationName = string(i)
|
|
}
|
|
|
|
// MeterConfig contains options for Meters.
|
|
type MeterConfig struct {
|
|
// InstrumentationVersion is the version of the library providing
|
|
// instrumentation.
|
|
InstrumentationVersion string
|
|
}
|
|
|
|
// MeterOption is an interface for applying Meter options.
|
|
type MeterOption interface {
|
|
// ApplyMeter is used to set a MeterOption value of a MeterConfig.
|
|
ApplyMeter(*MeterConfig)
|
|
}
|
|
|
|
// NewMeterConfig creates a new MeterConfig and applies
|
|
// all the given options.
|
|
func NewMeterConfig(opts ...MeterOption) MeterConfig {
|
|
var config MeterConfig
|
|
for _, o := range opts {
|
|
o.ApplyMeter(&config)
|
|
}
|
|
return config
|
|
}
|
|
|
|
// InstrumentationOption is an interface for applying instrumentation specific
|
|
// options.
|
|
type InstrumentationOption interface {
|
|
InstrumentOption
|
|
MeterOption
|
|
TracerOption
|
|
}
|
|
|
|
// WithInstrumentationVersion sets the instrumentation version.
|
|
func WithInstrumentationVersion(version string) InstrumentationOption {
|
|
return instrumentationVersionOption(version)
|
|
}
|
|
|
|
type instrumentationVersionOption string
|
|
|
|
func (i instrumentationVersionOption) ApplyMeter(config *MeterConfig) {
|
|
config.InstrumentationVersion = string(i)
|
|
}
|
|
|
|
func (i instrumentationVersionOption) ApplyInstrument(config *InstrumentConfig) {
|
|
config.InstrumentationVersion = string(i)
|
|
}
|
|
|
|
func (i instrumentationVersionOption) ApplyTracer(config *TracerConfig) {
|
|
config.InstrumentationVersion = string(i)
|
|
}
|