221 lines
8.1 KiB
Go
221 lines
8.1 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package migration // import "go.opentelemetry.io/collector/service/telemetry/internal/migration"
|
|
|
|
import (
|
|
"time"
|
|
|
|
config "go.opentelemetry.io/contrib/otelconf/v0.3.0"
|
|
"go.uber.org/zap/zapcore"
|
|
|
|
"go.opentelemetry.io/collector/config/configtelemetry"
|
|
"go.opentelemetry.io/collector/confmap"
|
|
)
|
|
|
|
type TracesConfigV030 struct {
|
|
// Level configures whether spans are emitted or not, the possible values are:
|
|
// - "none" indicates that no tracing data should be collected;
|
|
// - "basic" is the recommended and covers the basics of the service telemetry.
|
|
Level configtelemetry.Level `mapstructure:"level"`
|
|
// Propagators is a list of TextMapPropagators from the supported propagators list. Currently,
|
|
// tracecontext and b3 are supported. By default, the value is set to empty list and
|
|
// context propagation is disabled.
|
|
Propagators []string `mapstructure:"propagators"`
|
|
// Processors allow configuration of span processors to emit spans to
|
|
// any number of supported backends.
|
|
Processors []config.SpanProcessor `mapstructure:"processors"`
|
|
}
|
|
|
|
func (c *TracesConfigV030) Unmarshal(conf *confmap.Conf) error {
|
|
unmarshaled := *c
|
|
if err := conf.Unmarshal(c); err != nil {
|
|
v2TracesConfig := tracesConfigV020{
|
|
Level: unmarshaled.Level,
|
|
Propagators: unmarshaled.Propagators,
|
|
}
|
|
// try unmarshaling using v0.2.0 struct
|
|
if e := conf.Unmarshal(&v2TracesConfig); e != nil {
|
|
// error could not be resolved through backwards
|
|
// compatibility attempts
|
|
return err
|
|
}
|
|
// TODO: add a warning log to tell users to migrate their config
|
|
return tracesConfigV02ToV03(v2TracesConfig, c)
|
|
}
|
|
// ensure endpoint normalization occurs
|
|
for _, r := range c.Processors {
|
|
if r.Batch != nil {
|
|
if r.Batch.Exporter.OTLP != nil {
|
|
r.Batch.Exporter.OTLP.Endpoint = normalizeEndpoint(*r.Batch.Exporter.OTLP.Endpoint)
|
|
}
|
|
}
|
|
if r.Simple != nil {
|
|
if r.Simple.Exporter.OTLP != nil && r.Simple.Exporter.OTLP.Endpoint != nil {
|
|
r.Simple.Exporter.OTLP.Endpoint = normalizeEndpoint(*r.Simple.Exporter.OTLP.Endpoint)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type MetricsConfigV030 struct {
|
|
// Level is the level of telemetry metrics, the possible values are:
|
|
// - "none" indicates that no telemetry data should be collected;
|
|
// - "basic" is the recommended and covers the basics of the service telemetry.
|
|
// - "normal" adds some other indicators on top of basic.
|
|
// - "detailed" adds dimensions and views to the previous levels.
|
|
Level configtelemetry.Level `mapstructure:"level"`
|
|
|
|
config.MeterProvider `mapstructure:",squash"`
|
|
}
|
|
|
|
func (c *MetricsConfigV030) Unmarshal(conf *confmap.Conf) error {
|
|
unmarshaled := *c
|
|
if err := conf.Unmarshal(c); err != nil {
|
|
v02 := metricsConfigV020{
|
|
Level: unmarshaled.Level,
|
|
}
|
|
// try unmarshaling using v0.2.0 struct
|
|
if e := conf.Unmarshal(&v02); e != nil {
|
|
// error could not be resolved through backwards
|
|
// compatibility attempts
|
|
return err
|
|
}
|
|
// TODO: add a warning log to tell users to migrate their config
|
|
return metricsConfigV02ToV03(v02, c)
|
|
}
|
|
// ensure endpoint normalization occurs
|
|
for _, r := range c.Readers {
|
|
if r.Periodic != nil {
|
|
if r.Periodic.Exporter.OTLP != nil && r.Periodic.Exporter.OTLP.Endpoint != nil {
|
|
r.Periodic.Exporter.OTLP.Endpoint = normalizeEndpoint(*r.Periodic.Exporter.OTLP.Endpoint)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type LogsConfigV030 struct {
|
|
// Level is the minimum enabled logging level.
|
|
// (default = "INFO")
|
|
Level zapcore.Level `mapstructure:"level"`
|
|
|
|
// Development puts the logger in development mode, which changes the
|
|
// behavior of DPanicLevel and takes stacktraces more liberally.
|
|
// (default = false)
|
|
Development bool `mapstructure:"development,omitempty"`
|
|
|
|
// Encoding sets the logger's encoding.
|
|
// Example values are "json", "console".
|
|
Encoding string `mapstructure:"encoding"`
|
|
|
|
// DisableCaller stops annotating logs with the calling function's file
|
|
// name and line number. By default, all logs are annotated.
|
|
// (default = false)
|
|
DisableCaller bool `mapstructure:"disable_caller,omitempty"`
|
|
|
|
// DisableStacktrace completely disables automatic stacktrace capturing. By
|
|
// default, stacktraces are captured for WarnLevel and above logs in
|
|
// development and ErrorLevel and above in production.
|
|
// (default = false)
|
|
DisableStacktrace bool `mapstructure:"disable_stacktrace,omitempty"`
|
|
|
|
// Sampling sets a sampling policy.
|
|
// Default:
|
|
// sampling:
|
|
// enabled: true
|
|
// tick: 10s
|
|
// initial: 10
|
|
// thereafter: 100
|
|
// Sampling can be disabled by setting 'enabled' to false
|
|
Sampling *LogsSamplingConfig `mapstructure:"sampling"`
|
|
|
|
// OutputPaths is a list of URLs or file paths to write logging output to.
|
|
// The URLs could only be with "file" schema or without schema.
|
|
// The URLs with "file" schema must be an absolute path.
|
|
// The URLs without schema are treated as local file paths.
|
|
// "stdout" and "stderr" are interpreted as os.Stdout and os.Stderr.
|
|
// see details at Open in zap/writer.go.
|
|
// (default = ["stderr"])
|
|
OutputPaths []string `mapstructure:"output_paths"`
|
|
|
|
// ErrorOutputPaths is a list of URLs or file paths to write zap internal logger errors to.
|
|
// The URLs could only be with "file" schema or without schema.
|
|
// The URLs with "file" schema must use absolute paths.
|
|
// The URLs without schema are treated as local file paths.
|
|
// "stdout" and "stderr" are interpreted as os.Stdout and os.Stderr.
|
|
// see details at Open in zap/writer.go.
|
|
//
|
|
// Note that this setting only affects the zap internal logger errors.
|
|
// (default = ["stderr"])
|
|
ErrorOutputPaths []string `mapstructure:"error_output_paths"`
|
|
|
|
// InitialFields is a collection of fields to add to the root logger.
|
|
// Example:
|
|
//
|
|
// initial_fields:
|
|
// foo: "bar"
|
|
//
|
|
// By default, there is no initial field.
|
|
InitialFields map[string]any `mapstructure:"initial_fields,omitempty"`
|
|
|
|
// Processors allow configuration of log record processors to emit logs to
|
|
// any number of supported backends.
|
|
Processors []config.LogRecordProcessor `mapstructure:"processors,omitempty"`
|
|
}
|
|
|
|
// LogsSamplingConfig sets a sampling strategy for the logger. Sampling caps the
|
|
// global CPU and I/O load that logging puts on your process while attempting
|
|
// to preserve a representative subset of your logs.
|
|
type LogsSamplingConfig struct {
|
|
// Enabled enable sampling logging
|
|
Enabled bool `mapstructure:"enabled"`
|
|
// Tick represents the interval in seconds that the logger apply each sampling.
|
|
Tick time.Duration `mapstructure:"tick"`
|
|
// Initial represents the first M messages logged each Tick.
|
|
Initial int `mapstructure:"initial"`
|
|
// Thereafter represents the sampling rate, every Nth message will be sampled after Initial messages are logged during each Tick.
|
|
// If Thereafter is zero, the logger will drop all the messages after the Initial each Tick.
|
|
Thereafter int `mapstructure:"thereafter"`
|
|
}
|
|
|
|
func (c *LogsConfigV030) Unmarshal(conf *confmap.Conf) error {
|
|
unmarshaled := *c
|
|
if err := conf.Unmarshal(c); err != nil {
|
|
v02 := logsConfigV020{
|
|
Level: unmarshaled.Level,
|
|
Development: unmarshaled.Development,
|
|
Encoding: unmarshaled.Encoding,
|
|
DisableCaller: unmarshaled.DisableCaller,
|
|
DisableStacktrace: unmarshaled.DisableStacktrace,
|
|
Sampling: unmarshaled.Sampling,
|
|
OutputPaths: unmarshaled.OutputPaths,
|
|
ErrorOutputPaths: unmarshaled.ErrorOutputPaths,
|
|
InitialFields: unmarshaled.InitialFields,
|
|
}
|
|
// try unmarshaling using v0.2.0 struct
|
|
if e := conf.Unmarshal(&v02); e != nil {
|
|
// error could not be resolved through backwards
|
|
// compatibility attempts
|
|
return err
|
|
}
|
|
// TODO: add a warning log to tell users to migrate their config
|
|
return logsConfigV02ToV03(v02, c)
|
|
}
|
|
// ensure endpoint normalization occurs
|
|
for _, r := range c.Processors {
|
|
if r.Batch != nil {
|
|
if r.Batch.Exporter.OTLP != nil {
|
|
r.Batch.Exporter.OTLP.Endpoint = normalizeEndpoint(*r.Batch.Exporter.OTLP.Endpoint)
|
|
}
|
|
}
|
|
if r.Simple != nil {
|
|
if r.Simple.Exporter.OTLP != nil && r.Simple.Exporter.OTLP.Endpoint != nil {
|
|
r.Simple.Exporter.OTLP.Endpoint = normalizeEndpoint(*r.Simple.Exporter.OTLP.Endpoint)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|