contrib/rs/zerolog

Those integration are enabled by having the following import in the project’s orchestrion.tool.go file:

import (
	_ "github.com/DataDog/orchestrion"

	_ "github.com/DataDog/dd-trace-go/contrib/rs/zerolog/v2" // integration
	//...
)

Structured, pluggable logging for Go.

DDContextLogHook

Join Point
Definition of zerolog.Logger
Advice
Introduce new declarations:
// Using the following synthetic imports:
import (
	ext "github.com/DataDog/dd-trace-go/v2/ddtrace/ext"
	strconv "strconv"
	telemetry "github.com/DataDog/dd-trace-go/v2/internal/telemetry"
	tracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"
)
func init() {
	telemetry.LoadIntegration("rs/zerolog")
	tracer.MarkIntegrationImported("github.com/rs/zerolog")
}

// DDContextLogHook ensures that any span in the log context is correlated to log output.
type DDContextLogHook struct{}

// Run implements zerolog.Hook interface, attaches trace and span details found in entry context
func (d DDContextLogHook) Run(e *Event, _ Level, _ string) {
		span, found := tracer.SpanFromContext(e.GetCtx())
		if !found {
				return
		}
		e.Str(ext.LogKeyTraceID, span.Context().TraceID())
		e.Str(ext.LogKeySpanID, strconv.FormatUint(span.Context().SpanID(), 10))
}

New

Join Point
All of
Advice
Prepend statements produced by the following template:
{{- $logger := .Function.Result 0 -}}
defer func() {
	{{ $logger }} = {{ $logger }}.Hook(&DDContextLogHook{})
}()

*zerolog.Logger

Join Point
Struct literal zerolog.Logger
  • Pointer
Advice
Replace the expression using the template:
// Using the following synthetic imports:
import (
	zerolog "github.com/rs/zerolog"
)
func(logger *zerolog.Logger) *zerolog.Logger {
	*logger = logger.Hook(&zerolog.DDContextLogHook{})
	return logger
}({{ . }})

zerolog.Logger

Join Point
Struct literal zerolog.Logger
  • Value
Advice
Replace the expression using the template:
// Using the following synthetic imports:
import (
	zerolog "github.com/rs/zerolog"
)
func(logger zerolog.Logger) zerolog.Logger {
	return logger.Hook(&zerolog.DDContextLogHook{})
}({{ . }})