mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2024-12-26 21:05:00 +02:00
23f7b41e0a
Fixes https://github.com/open-telemetry/opentelemetry-go/issues/5769 Related spec PR: https://github.com/open-telemetry/opentelemetry-specification/pull/4203 Remark: A follow-up in contrib is required and afterwards here to fix the `example/dice`. Benchstat results for `sdk/log` (`log` has no benchmarks related to Enabled): ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/sdk/log cpu: Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz │ old.txt │ new.txt │ │ sec/op │ sec/op vs base │ BatchProcessorOnEmit-16 398.8n ± 10% 395.6n ± 12% ~ (p=0.971 n=10) Processor/Simple-16 882.2n ± 8% 869.8n ± 9% ~ (p=0.811 n=10) Processor/Batch-16 1.478µ ± 3% 1.485µ ± 5% ~ (p=0.646 n=10) Processor/SetTimestampSimple-16 847.8n ± 1% 844.6n ± 3% ~ (p=0.247 n=10) Processor/SetTimestampBatch-16 1.480µ ± 3% 1.473µ ± 4% ~ (p=0.700 n=10) Processor/AddAttributesSimple-16 930.0n ± 1% 933.8n ± 1% ~ (p=0.172 n=10) Processor/AddAttributesBatch-16 1.624µ ± 2% 1.639µ ± 2% ~ (p=0.839 n=10) Processor/SetAttributesSimple-16 903.4n ± 1% 895.1n ± 1% ~ (p=0.190 n=10) Processor/SetAttributesBatch-16 1.554µ ± 4% 1.529µ ± 3% ~ (p=0.159 n=10) LoggerNewRecord/5_attributes-16 346.0n ± 2% 343.3n ± 2% ~ (p=0.448 n=10) LoggerNewRecord/10_attributes-16 1.608µ ± 6% 1.503µ ± 2% -6.53% (p=0.007 n=10) LoggerEnabled-16 34.305n ± 8% 6.706n ± 1% -80.45% (p=0.000 n=10) LoggerProviderLogger-16 636.9n ± 10% 605.8n ± 3% ~ (p=0.105 n=10) WalkAttributes/1_attributes-16 5.363n ± 3% 4.540n ± 14% -15.34% (p=0.002 n=10) WalkAttributes/10_attributes-16 5.436n ± 7% 4.461n ± 2% -17.95% (p=0.000 n=10) WalkAttributes/100_attributes-16 5.126n ± 9% 4.465n ± 1% -12.90% (p=0.000 n=10) WalkAttributes/1000_attributes-16 5.316n ± 9% 4.502n ± 5% -15.32% (p=0.002 n=10) SetAddAttributes/SetAttributes-16 220.5n ± 18% 192.6n ± 11% -12.67% (p=0.007 n=10) SetAddAttributes/AddAttributes-16 165.3n ± 21% 127.3n ± 22% -22.96% (p=0.011 n=10) SimpleProcessorOnEmit-16 2.159n ± 9% 2.167n ± 9% ~ (p=0.739 n=10) geomean 178.3n 154.5n -13.31% │ old.txt │ new.txt │ │ B/s │ B/s vs base │ BatchProcessorOnEmit-16 76.52Mi ± 11% 77.14Mi ± 14% ~ (p=0.971 n=10) │ old.txt │ new.txt │ │ B/op │ B/op vs base │ BatchProcessorOnEmit-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/Simple-16 417.0 ± 0% 417.0 ± 0% ~ (p=1.000 n=10) ¹ Processor/Batch-16 1.093Ki ± 1% 1.088Ki ± 1% ~ (p=0.254 n=10) Processor/SetTimestampSimple-16 417.0 ± 0% 417.0 ± 0% ~ (p=1.000 n=10) ¹ Processor/SetTimestampBatch-16 1.095Ki ± 1% 1.084Ki ± 2% ~ (p=0.361 n=10) Processor/AddAttributesSimple-16 417.0 ± 0% 417.0 ± 0% ~ (p=1.000 n=10) ¹ Processor/AddAttributesBatch-16 1.085Ki ± 1% 1.086Ki ± 1% ~ (p=1.000 n=10) Processor/SetAttributesSimple-16 465.0 ± 0% 465.0 ± 0% ~ (p=1.000 n=10) ¹ Processor/SetAttributesBatch-16 1.129Ki ± 1% 1.125Ki ± 1% ~ (p=0.084 n=10) LoggerNewRecord/5_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ LoggerNewRecord/10_attributes-16 610.0 ± 0% 610.0 ± 0% ~ (p=1.000 n=10) ¹ LoggerEnabled-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ LoggerProviderLogger-16 359.0 ± 6% 346.0 ± 3% ~ (p=0.117 n=10) WalkAttributes/1_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ WalkAttributes/10_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ WalkAttributes/100_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ WalkAttributes/1000_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ SetAddAttributes/SetAttributes-16 48.00 ± 0% 48.00 ± 0% ~ (p=1.000 n=10) ¹ SetAddAttributes/AddAttributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ SimpleProcessorOnEmit-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ geomean ² -0.27% ² ¹ all samples are equal ² summaries must be >0 to compute geomean │ old.txt │ new.txt │ │ allocs/op │ allocs/op vs base │ BatchProcessorOnEmit-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/Simple-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/Batch-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/SetTimestampSimple-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/SetTimestampBatch-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/AddAttributesSimple-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/AddAttributesBatch-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/SetAttributesSimple-16 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ Processor/SetAttributesBatch-16 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ LoggerNewRecord/5_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ LoggerNewRecord/10_attributes-16 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ LoggerEnabled-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ LoggerProviderLogger-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ WalkAttributes/1_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ WalkAttributes/10_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ WalkAttributes/100_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ WalkAttributes/1000_attributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ SetAddAttributes/SetAttributes-16 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹ SetAddAttributes/AddAttributes-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ SimpleProcessorOnEmit-16 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ geomean ² +0.00% ² ¹ all samples are equal ² summaries must be >0 to compute geomean ```
150 lines
4.8 KiB
Go
150 lines
4.8 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package log // import "go.opentelemetry.io/otel/log"
|
|
|
|
import (
|
|
"context"
|
|
|
|
"go.opentelemetry.io/otel/attribute"
|
|
"go.opentelemetry.io/otel/log/embedded"
|
|
)
|
|
|
|
// Logger emits log records.
|
|
//
|
|
// Warning: Methods may be added to this interface in minor releases. See
|
|
// package documentation on API implementation for information on how to set
|
|
// default behavior for unimplemented methods.
|
|
type Logger interface {
|
|
// Users of the interface can ignore this. This embedded type is only used
|
|
// by implementations of this interface. See the "API Implementations"
|
|
// section of the package documentation for more information.
|
|
embedded.Logger
|
|
|
|
// Emit emits a log record.
|
|
//
|
|
// The record may be held by the implementation. Callers should not mutate
|
|
// the record after passed.
|
|
//
|
|
// Implementations of this method need to be safe for a user to call
|
|
// concurrently.
|
|
Emit(ctx context.Context, record Record)
|
|
|
|
// Enabled returns whether the Logger emits for the given context and
|
|
// param.
|
|
//
|
|
// The passed param is likely to be a partial record with only the
|
|
// bridge-relevant information being provided (e.g a param with only the
|
|
// Severity set). If a Logger needs more information than is provided, it
|
|
// is said to be in an indeterminate state (see below).
|
|
//
|
|
// The returned value will be true when the Logger will emit for the
|
|
// provided context and param, and will be false if the Logger will not
|
|
// emit. The returned value may be true or false in an indeterminate state.
|
|
// An implementation should default to returning true for an indeterminate
|
|
// state, but may return false if valid reasons in particular circumstances
|
|
// exist (e.g. performance, correctness).
|
|
//
|
|
// The param should not be held by the implementation. A copy should be
|
|
// made if the record needs to be held after the call returns.
|
|
//
|
|
// Implementations of this method need to be safe for a user to call
|
|
// concurrently.
|
|
Enabled(ctx context.Context, param EnabledParameters) bool
|
|
}
|
|
|
|
// LoggerOption applies configuration options to a [Logger].
|
|
type LoggerOption interface {
|
|
// applyLogger is used to set a LoggerOption value of a LoggerConfig.
|
|
applyLogger(LoggerConfig) LoggerConfig
|
|
}
|
|
|
|
// LoggerConfig contains options for a [Logger].
|
|
type LoggerConfig struct {
|
|
// Ensure forward compatibility by explicitly making this not comparable.
|
|
noCmp [0]func() //nolint: unused // This is indeed used.
|
|
|
|
version string
|
|
schemaURL string
|
|
attrs attribute.Set
|
|
}
|
|
|
|
// NewLoggerConfig returns a new [LoggerConfig] with all the options applied.
|
|
func NewLoggerConfig(options ...LoggerOption) LoggerConfig {
|
|
var c LoggerConfig
|
|
for _, opt := range options {
|
|
c = opt.applyLogger(c)
|
|
}
|
|
return c
|
|
}
|
|
|
|
// InstrumentationVersion returns the version of the library providing
|
|
// instrumentation.
|
|
func (cfg LoggerConfig) InstrumentationVersion() string {
|
|
return cfg.version
|
|
}
|
|
|
|
// InstrumentationAttributes returns the attributes associated with the library
|
|
// providing instrumentation.
|
|
func (cfg LoggerConfig) InstrumentationAttributes() attribute.Set {
|
|
return cfg.attrs
|
|
}
|
|
|
|
// SchemaURL returns the schema URL of the library providing instrumentation.
|
|
func (cfg LoggerConfig) SchemaURL() string {
|
|
return cfg.schemaURL
|
|
}
|
|
|
|
type loggerOptionFunc func(LoggerConfig) LoggerConfig
|
|
|
|
func (fn loggerOptionFunc) applyLogger(cfg LoggerConfig) LoggerConfig {
|
|
return fn(cfg)
|
|
}
|
|
|
|
// WithInstrumentationVersion returns a [LoggerOption] that sets the
|
|
// instrumentation version of a [Logger].
|
|
func WithInstrumentationVersion(version string) LoggerOption {
|
|
return loggerOptionFunc(func(config LoggerConfig) LoggerConfig {
|
|
config.version = version
|
|
return config
|
|
})
|
|
}
|
|
|
|
// WithInstrumentationAttributes returns a [LoggerOption] that sets the
|
|
// instrumentation attributes of a [Logger].
|
|
//
|
|
// The passed attributes will be de-duplicated.
|
|
func WithInstrumentationAttributes(attr ...attribute.KeyValue) LoggerOption {
|
|
return loggerOptionFunc(func(config LoggerConfig) LoggerConfig {
|
|
config.attrs = attribute.NewSet(attr...)
|
|
return config
|
|
})
|
|
}
|
|
|
|
// WithSchemaURL returns a [LoggerOption] that sets the schema URL for a
|
|
// [Logger].
|
|
func WithSchemaURL(schemaURL string) LoggerOption {
|
|
return loggerOptionFunc(func(config LoggerConfig) LoggerConfig {
|
|
config.schemaURL = schemaURL
|
|
return config
|
|
})
|
|
}
|
|
|
|
// EnabledParameters represents payload for [Logger]'s Enabled method.
|
|
type EnabledParameters struct {
|
|
severity Severity
|
|
severitySet bool
|
|
}
|
|
|
|
// Severity returns the [Severity] level value, or [SeverityUndefined] if no value was set.
|
|
// The ok result indicates whether the value was set.
|
|
func (r *EnabledParameters) Severity() (value Severity, ok bool) {
|
|
return r.severity, r.severitySet
|
|
}
|
|
|
|
// SetSeverity sets the [Severity] level.
|
|
func (r *EnabledParameters) SetSeverity(level Severity) {
|
|
r.severity = level
|
|
r.severitySet = true
|
|
}
|