From 28acbbfe9255919c7e1efdbaaf7280fd2df99645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Paj=C4=85k?= Date: Fri, 9 Aug 2024 09:24:14 +0200 Subject: [PATCH] Remove otelzerolog (#5996) Fixes https://github.com/open-telemetry/opentelemetry-go-contrib/issues/5969 --- CHANGELOG.md | 2 - CODEOWNERS | 1 - bridges/otelzerolog/example_test.go | 23 ---- bridges/otelzerolog/go.mod | 23 ---- bridges/otelzerolog/go.sum | 42 ------ bridges/otelzerolog/hook.go | 153 --------------------- bridges/otelzerolog/hook_test.go | 203 ---------------------------- 7 files changed, 447 deletions(-) delete mode 100644 bridges/otelzerolog/example_test.go delete mode 100644 bridges/otelzerolog/go.mod delete mode 100644 bridges/otelzerolog/go.sum delete mode 100644 bridges/otelzerolog/hook.go delete mode 100644 bridges/otelzerolog/hook_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 41521bc3d77..6cc84bc0f74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - The `go.opentelemetry.io/contrib/config` package supports configuring `with_resource_constant_labels` for the prometheus exporter. (#5890) - Add new runtime metrics to `go.opentelemetry.io/contrib/instrumentation/runtime`, which are still disabled by default. (#5870) - Support for the `OTEL_HTTP_CLIENT_COMPATIBILITY_MODE=http/dup` environment variable in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` to emit attributes for both the v1.20.0 and v1.26.0 semantic conventions. (#5401) -- The `go.opentelemetry.io/contrib/bridges/otelzerolog` module. - This module provides an OpenTelemetry logging bridge for `github.com/rs/zerolog`. (#5405) ### Removed diff --git a/CODEOWNERS b/CODEOWNERS index 58281da3558..f825c8de04f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -29,7 +29,6 @@ bridges/otelslog @open-te bridges/otellogrus/ @open-telemetry/go-approvers @dmathieu @pellared bridges/prometheus/ @open-telemetry/go-approvers @dashpole bridges/otelzap/ @open-telemetry/go-approvers @pellared @khushijain21 -bridges/otelzerolog/ @open-telemetry/go-approvers @dmathieu @AkhigbeEromo config/ @open-telemetry/go-approvers @MadVikingGod @pellared @codeboten diff --git a/bridges/otelzerolog/example_test.go b/bridges/otelzerolog/example_test.go deleted file mode 100644 index 2eb869d75c2..00000000000 --- a/bridges/otelzerolog/example_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package otelzerolog_test - -import ( - "os" - - "github.com/rs/zerolog" - - "go.opentelemetry.io/contrib/bridges/otelzerolog" - "go.opentelemetry.io/otel/log/noop" -) - -func Example() { - // Use a working LoggerProvider implementation instead e.g. using go.opentelemetry.io/otel/sdk/log. - provider := noop.NewLoggerProvider() - - // Create a logger that emits logs to both STDOUT and the OTel Go SDK. - hook := otelzerolog.NewHook("my/pkg/name", otelzerolog.WithLoggerProvider(provider)) - logger := zerolog.New(os.Stdout).With().Logger() - logger = logger.Hook(hook) -} diff --git a/bridges/otelzerolog/go.mod b/bridges/otelzerolog/go.mod deleted file mode 100644 index 21b0bbe7e24..00000000000 --- a/bridges/otelzerolog/go.mod +++ /dev/null @@ -1,23 +0,0 @@ -module go.opentelemetry.io/contrib/bridges/otelzerolog - -go 1.21 - -require ( - github.com/rs/zerolog v1.33.0 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel/log v0.4.0 -) - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-logr/logr v1.4.2 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect - golang.org/x/sys v0.24.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/bridges/otelzerolog/go.sum b/bridges/otelzerolog/go.sum deleted file mode 100644 index c9065642328..00000000000 --- a/bridges/otelzerolog/go.sum +++ /dev/null @@ -1,42 +0,0 @@ -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= -go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/bridges/otelzerolog/hook.go b/bridges/otelzerolog/hook.go deleted file mode 100644 index f9b2b5cb2c4..00000000000 --- a/bridges/otelzerolog/hook.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Package otelzerolog provides a [Hook], a [zerolog.Hook] implementation that -// can be used to bridge between the [zerolog] API and [OpenTelemetry]. -// -// # Record Conversion -// -// The [zerolog.Event] records are converted to OpenTelemetry [log.Record] in -// the following way: -// -// - Message is set as the Body using a [log.StringValue]. -// - Level is transformed and set as the Severity. The SeverityText is also -// set. -// -// The Level is transformed to the OpenTelemetry Severity types in the following way. -// -// - [zerolog.DebugLevel] is transformed to [log.SeverityDebug] -// - [zerolog.InfoLevel] is transformed to [log.SeverityInfo] -// - [zerolog.WarnLevel] is transformed to [log.SeverityWarn] -// - [zerolog.ErrorLevel] is transformed to [log.SeverityError] -// - [zerolog.PanicLevel] is transformed to [log.SeverityFatal1] -// - [zerolog.FatalLevel] is transformed to [log.SeverityFatal2] -// -// NOTE: Fields are not transformed because of https://github.com/rs/zerolog/issues/493. -// -// [OpenTelemetry]: https://opentelemetry.io/docs/concepts/signals/logs/ -package otelzerolog // import "go.opentelemetry.io/contrib/bridges/otelzerolog" - -import ( - "github.com/rs/zerolog" - - "go.opentelemetry.io/otel/log" - "go.opentelemetry.io/otel/log/global" -) - -type config struct { - provider log.LoggerProvider - version string - schemaURL string -} - -func newConfig(options []Option) config { - var c config - for _, opt := range options { - c = opt.apply(c) - } - - if c.provider == nil { - c.provider = global.GetLoggerProvider() - } - return c -} - -func (c config) logger(name string) log.Logger { - var opts []log.LoggerOption - if c.version != "" { - opts = append(opts, log.WithInstrumentationVersion(c.version)) - } - if c.schemaURL != "" { - opts = append(opts, log.WithSchemaURL(c.schemaURL)) - } - return c.provider.Logger(name, opts...) -} - -// Option configures a Hook. -type Option interface { - apply(config) config -} -type optFunc func(config) config - -func (f optFunc) apply(c config) config { return f(c) } - -// WithVersion returns an [Option] that configures the version of the -// [log.Logger] used by a [Hook]. The version should be the version of the -// package that is being logged. -func WithVersion(version string) Option { - return optFunc(func(c config) config { - c.version = version - return c - }) -} - -// WithSchemaURL returns an [Option] that configures the semantic convention -// schema URL of the [log.Logger] used by a [Hook]. The schemaURL should be -// the schema URL for the semantic conventions used in log records. -func WithSchemaURL(schemaURL string) Option { - return optFunc(func(c config) config { - c.schemaURL = schemaURL - return c - }) -} - -// WithLoggerProvider returns an [Option] that configures [log.LoggerProvider] -// used by a [Hook]. -// -// By default if this Option is not provided, the Hook will use the global -// LoggerProvider. -func WithLoggerProvider(provider log.LoggerProvider) Option { - return optFunc(func(c config) config { - c.provider = provider - return c - }) -} - -// Hook is a [zerolog.Hook] that sends all logging records it receives to -// OpenTelemetry. See package documentation for how conversions are made. -type Hook struct { - logger log.Logger -} - -// NewHook returns a new [Hook] to be used as a [Zerolog.Hook]. -// If [WithLoggerProvider] is not provided, the returned Hook will use the -// global LoggerProvider. -func NewHook(name string, options ...Option) *Hook { - cfg := newConfig(options) - return &Hook{ - logger: cfg.logger(name), - } -} - -// Run handles the passed record, and sends it to OpenTelemetry. -func (h Hook) Run(e *zerolog.Event, level zerolog.Level, msg string) { - r := log.Record{} - r.SetSeverity(convertLevel(level)) - r.SetBody(log.StringValue(msg)) - r.SetSeverityText(level.String()) - - // TODO: add support for attributes - // This is limited by zerolog's inability to retrieve fields. - // https://github.com/rs/zerolog/issues/493 - - h.logger.Emit(e.GetCtx(), r) -} - -func convertLevel(level zerolog.Level) log.Severity { - switch level { - case zerolog.DebugLevel: - return log.SeverityDebug - case zerolog.InfoLevel: - return log.SeverityInfo - case zerolog.WarnLevel: - return log.SeverityWarn - case zerolog.ErrorLevel: - return log.SeverityError - case zerolog.PanicLevel: - return log.SeverityFatal1 - case zerolog.FatalLevel: - return log.SeverityFatal2 - default: - return log.SeverityUndefined - } -} diff --git a/bridges/otelzerolog/hook_test.go b/bridges/otelzerolog/hook_test.go deleted file mode 100644 index 9a610297b66..00000000000 --- a/bridges/otelzerolog/hook_test.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 -package otelzerolog - -import ( - "os" - "testing" - - "github.com/rs/zerolog" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "go.opentelemetry.io/otel/log" - "go.opentelemetry.io/otel/log/embedded" - "go.opentelemetry.io/otel/log/global" - "go.opentelemetry.io/otel/log/logtest" -) - -type mockLoggerProvider struct { - embedded.LoggerProvider -} - -func (mockLoggerProvider) Logger(name string, options ...log.LoggerOption) log.Logger { - return nil -} - -func TestNewConfig(t *testing.T) { - customLoggerProvider := mockLoggerProvider{} - - for _, tt := range []struct { - name string - options []Option - - wantConfig config - }{ - { - name: "with no options", - wantConfig: config{ - provider: global.GetLoggerProvider(), - }, - }, - { - name: "with a custom version", - options: []Option{ - WithVersion("1.0"), - }, - wantConfig: config{ - version: "1.0", - provider: global.GetLoggerProvider(), - }, - }, - { - name: "with a custom schema URL", - options: []Option{ - WithSchemaURL("https://example.com"), - }, - wantConfig: config{ - schemaURL: "https://example.com", - provider: global.GetLoggerProvider(), - }, - }, - { - name: "with a custom logger provider", - options: []Option{ - WithLoggerProvider(customLoggerProvider), - }, - wantConfig: config{ - provider: customLoggerProvider, - }, - }, - } { - t.Run(tt.name, func(t *testing.T) { - assert.Equal(t, tt.wantConfig, newConfig(tt.options)) - }) - } -} - -func TestNewHook(t *testing.T) { - const name = "test_hook" - provider := global.GetLoggerProvider() - - for _, tt := range []struct { - name string - options []Option - wantLogger log.Logger - }{ - { - name: "with default options", - wantLogger: provider.Logger(name), - }, - { - name: "with version and schema URL", - options: []Option{ - WithVersion("1.0"), - WithSchemaURL("https://example.com"), - }, - wantLogger: provider.Logger(name, - log.WithInstrumentationVersion("1.0"), - log.WithSchemaURL("https://example.com"), - ), - }, - } { - t.Run(tt.name, func(t *testing.T) { - hook := NewHook(name, tt.options...) - assert.NotNil(t, hook) - assert.Equal(t, tt.wantLogger, hook.logger) - }) - } -} - -var ( - testMessage = "log message" - loggerName = "name" - testKey = "key" - testValue = "value" - testEntry = zerolog.InfoLevel -) - -func TestHookRun(t *testing.T) { - rec := logtest.NewRecorder() - hook := NewHook(loggerName, WithLoggerProvider(rec)) - - logger := zerolog.New(os.Stderr).Hook(hook) - - t.Run("Run", func(t *testing.T) { - // Create an event and run the hook - event := logger.Info().Str(testKey, testValue) - hook.Run(event, testEntry, testMessage) - - // Check the results - require.Len(t, rec.Result(), 1) - require.Len(t, rec.Result()[0].Records, 1) - got := rec.Result()[0].Records[0] - assert.Equal(t, testMessage, got.Body().AsString()) - assert.Equal(t, log.SeverityInfo, got.Severity()) - assert.Equal(t, zerolog.InfoLevel.String(), got.SeverityText()) - }) -} - -func TestConvertLevel(t *testing.T) { - tests := []struct { - name string - zerologLevel zerolog.Level - expected log.Severity - }{ - { - name: "DebugLevel", - zerologLevel: zerolog.DebugLevel, - expected: log.SeverityDebug, - }, - { - name: "InfoLevel", - zerologLevel: zerolog.InfoLevel, - expected: log.SeverityInfo, - }, - { - name: "WarnLevel", - zerologLevel: zerolog.WarnLevel, - expected: log.SeverityWarn, - }, - { - name: "ErrorLevel", - zerologLevel: zerolog.ErrorLevel, - expected: log.SeverityError, - }, - { - name: "PanicLevel", - zerologLevel: zerolog.PanicLevel, - expected: log.SeverityFatal1, - }, - { - name: "FatalLevel", - zerologLevel: zerolog.FatalLevel, - expected: log.SeverityFatal2, - }, - { - name: "UnknownLevel", - zerologLevel: zerolog.NoLevel, // An unknown level - expected: log.SeverityUndefined, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - actual := convertLevel(tt.zerologLevel) - assert.Equal(t, tt.expected, actual, "severity mismatch") - }) - } -} - -func BenchmarkHookRun(b *testing.B) { - rec := logtest.NewRecorder() - hook := NewHook(loggerName, WithLoggerProvider(rec)) - logger := zerolog.New(nil).Hook(hook) - level := zerolog.InfoLevel - msg := "benchmark log message" - event := logger.Info() - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - hook.Run(event, level, msg) - } -}