feat: add logrus hook for opentelemetry

Co-authored-by: sindrerh2 <sindre.rodseth.hansen@nav.no>
This commit is contained in:
Trong Huu Nguyen
2025-01-28 10:20:13 +01:00
parent 3fd8e3f3f3
commit 81058458e0
6 changed files with 38 additions and 9 deletions

5
go.mod
View File

@@ -22,9 +22,11 @@ require (
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.10.0
github.com/uptrace/opentelemetry-go-extra/otellogrus v0.3.2
go.opentelemetry.io/otel v1.34.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0
go.opentelemetry.io/otel/sdk v1.34.0
go.opentelemetry.io/otel/trace v1.34.0
go.uber.org/automaxprocs v1.6.0
golang.org/x/crypto v0.32.0
golang.org/x/oauth2 v0.25.0
@@ -72,11 +74,12 @@ require (
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2 // indirect
github.com/yuin/gopher-lua v1.1.1 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
go.opentelemetry.io/otel/log v0.6.0 // indirect
go.opentelemetry.io/otel/metric v1.34.0 // indirect
go.opentelemetry.io/otel/trace v1.34.0 // indirect
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect

6
go.sum
View File

@@ -150,6 +150,10 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/uptrace/opentelemetry-go-extra/otellogrus v0.3.2 h1:H8wwQwTe5sL6x30z71lUgNiwBdeCHQjrphCfLwqIHGo=
github.com/uptrace/opentelemetry-go-extra/otellogrus v0.3.2/go.mod h1:/kR4beFhlz2g+V5ik8jW+3PMiMQAPt29y6K64NNY53c=
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2 h1:3/aHKUq7qaFMWxyQV0W2ryNgg8x8rVeKVA20KJUkfS0=
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2/go.mod h1:Zit4b8AQXaXvA68+nzmbyDzqiyFRISyw1JiD5JqUBjw=
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
@@ -160,6 +164,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glB
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8=
go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM=
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=

View File

@@ -6,6 +6,7 @@ import (
"github.com/nais/wonderwall/pkg/config"
log "github.com/sirupsen/logrus"
"go.opentelemetry.io/otel/trace/noop"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
@@ -13,6 +14,7 @@ import (
"go.opentelemetry.io/otel/sdk/resource"
"go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/semconv/v1.26.0"
oteltrace "go.opentelemetry.io/otel/trace"
)
const (
@@ -20,6 +22,12 @@ const (
batchTimeout = 5 * time.Second
)
var tracer = noop.NewTracerProvider().Tracer("noop")
func Tracer() oteltrace.Tracer {
return tracer
}
func OpenTelemetry(ctx context.Context, cfg *config.Config) (func(context.Context) error, error) {
prop := newPropagator()
otel.SetTextMapPropagator(prop)
@@ -34,6 +42,7 @@ func OpenTelemetry(ctx context.Context, cfg *config.Config) (func(context.Contex
return nil, err
}
otel.SetTracerProvider(tracerProvider)
tracer = tracerProvider.Tracer("wonderwall")
log.Infof("opentelemetry: initialized configuration")
shutdown := func(ctx context.Context) error {

View File

@@ -5,6 +5,7 @@ import (
"time"
log "github.com/sirupsen/logrus"
"github.com/uptrace/opentelemetry-go-extra/otellogrus"
)
func TextFormatter() log.Formatter {
@@ -39,5 +40,14 @@ func Setup(level, format string) error {
log.SetLevel(logLevel)
log.Tracef("Trace logging enabled")
// Add OpenTelemetry logging hook.
// This attaches logs to the associated span in the given log context as events.
log.AddHook(otellogrus.NewHook(otellogrus.WithLevels(
log.PanicLevel,
log.FatalLevel,
log.ErrorLevel,
log.WarnLevel,
)))
return nil
}

View File

@@ -78,7 +78,9 @@ func (l *requestLogger) NewLogEntry(r *http.Request) *requestLoggerEntry {
"request_user_agent": r.UserAgent(),
}
entry.Logger = l.Logger.WithFields(fields)
entry.Logger = l.Logger.
WithContext(r.Context()).
WithFields(fields)
return entry
}

View File

@@ -3,10 +3,9 @@ package router
import (
"net/http"
"github.com/riandyrn/otelchi"
"github.com/go-chi/chi/v5"
chi_middleware "github.com/go-chi/chi/v5/middleware"
"github.com/riandyrn/otelchi"
"github.com/nais/wonderwall/pkg/config"
"github.com/nais/wonderwall/pkg/ingress"
@@ -56,15 +55,15 @@ func New(src Source, cfg *config.Config) chi.Router {
logentry := middleware.LogEntry(providerName)
r := chi.NewRouter()
r.Use(middleware.CorrelationIDHandler)
r.Use(chi_middleware.Recoverer)
r.Use(ingressMw.Handler)
if cfg.OpenTelemetry.Enabled {
r.Use(otelchi.Middleware(cfg.OpenTelemetry.ServiceName,
otelchi.WithChiRoutes(r),
otelchi.WithRequestMethodInSpanName(true)))
otelchi.WithRequestMethodInSpanName(true),
))
}
r.Use(middleware.CorrelationIDHandler)
r.Use(chi_middleware.Recoverer)
r.Use(ingressMw.Handler)
prefixes := src.GetIngresses().Paths()