From 38bdbbb3834238375c4980aa305d392afa3722cd Mon Sep 17 00:00:00 2001 From: e_forbes Date: Thu, 23 Oct 2025 17:47:38 +0100 Subject: [PATCH 1/4] feat: draft MR establishing the reporter package --- go.mod | 21 +++++++++--- go.sum | 30 +++++++++++++++++ reporter/context.go | 41 ++++++++++++++++++++++++ reporter/grpc.go | 25 +++++++++++++++ reporter/metrics.go | 22 +++++++++++++ reporter/reporter.go | 76 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 210 insertions(+), 5 deletions(-) create mode 100644 reporter/context.go create mode 100644 reporter/grpc.go create mode 100644 reporter/metrics.go create mode 100644 reporter/reporter.go diff --git a/go.mod b/go.mod index dda720d3..ca89468e 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module gitlab.com/gitlab-org/labkit -go 1.23.0 +go 1.24.0 require ( cloud.google.com/go/profiler v0.1.0 @@ -16,13 +16,16 @@ require ( github.com/prometheus/client_model v0.6.1 github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a github.com/sirupsen/logrus v1.9.3 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/uber/jaeger-client-go v2.29.1+incompatible gitlab.com/gitlab-org/go/reopen v1.0.0 go.opencensus.io v0.23.0 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 + go.opentelemetry.io/otel/sdk/metric v1.38.0 + go.uber.org/zap v1.27.0 golang.org/x/crypto v0.41.0 google.golang.org/api v0.54.0 - google.golang.org/grpc v1.67.1 + google.golang.org/grpc v1.76.0 google.golang.org/protobuf v1.36.6 gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 ) @@ -41,10 +44,12 @@ require ( github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.4 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/pprof v0.0.0-20210804190019-f964ff605595 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/gax-go/v2 v2.0.5 // indirect @@ -65,9 +70,15 @@ require ( github.com/tklauser/go-sysconf v0.3.4 // indirect github.com/tklauser/numcpus v0.2.1 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect go.uber.org/atomic v1.4.0 // indirect + go.uber.org/multierr v1.10.0 // indirect golang.org/x/net v0.42.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/sys v0.35.0 // indirect golang.org/x/text v0.28.0 // indirect diff --git a/go.sum b/go.sum index 7653da72..d264e4e6 100644 --- a/go.sum +++ b/go.sum @@ -111,6 +111,11 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/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/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -150,6 +155,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -294,6 +301,7 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tklauser/go-sysconf v0.3.4 h1:HT8SVixZd3IzLdfs/xlpq0jeSfTX57g1v6wB1EuzV7M= @@ -320,11 +328,29 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -427,6 +453,8 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -693,6 +721,8 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/reporter/context.go b/reporter/context.go new file mode 100644 index 00000000..320c3621 --- /dev/null +++ b/reporter/context.go @@ -0,0 +1,41 @@ +package reporter + +import ( + "context" + "maps" + + "go.uber.org/zap" +) + +type fieldsKey struct{} + +func getFields(ctx context.Context) Fields { + if val, ok := ctx.Value(fieldsKey{}).(Fields); ok { + return val + } + return Fields{} +} + +func toZapFields(fields ...Fields) []zap.Field { + zapFields := []zap.Field{} + + for _, fieldMap := range fields { + for k, v := range fieldMap { + zapFields = append(zapFields, zap.String(k, v.(string))) + } + } + + return zapFields +} + +func WithFields(ctx context.Context, fieldsNew ...Fields) context.Context { + fields := Fields{} + + maps.Copy(fields, getFields(ctx)) + + for _, fieldMap := range fieldsNew { + maps.Copy(fields, fieldMap) + } + + return context.WithValue(ctx, fieldsKey{}, fields) +} diff --git a/reporter/grpc.go b/reporter/grpc.go new file mode 100644 index 00000000..87e40664 --- /dev/null +++ b/reporter/grpc.go @@ -0,0 +1,25 @@ +package reporter + +import ( + "go.opentelemetry.io/otel/sdk/metric" + "google.golang.org/grpc" + "google.golang.org/grpc/stats/opentelemetry" +) + +func NewInstrumentedgRPCClient( + target string, + reporter Reporter, + opts ...grpc.DialOption, +) (*grpc.ClientConn, error) { + dialOption := otelDialOption(reporter.MeterProvider()) + dialOpts := append(opts, opentelemetry.DialOption(dialOption)) + return grpc.NewClient(target, dialOpts...) +} + +func otelDialOption(mp *metric.MeterProvider) opentelemetry.Options { + return opentelemetry.Options{ + MetricsOptions: opentelemetry.MetricsOptions{ + MeterProvider: mp, + }, + } +} diff --git a/reporter/metrics.go b/reporter/metrics.go new file mode 100644 index 00000000..30a8000f --- /dev/null +++ b/reporter/metrics.go @@ -0,0 +1,22 @@ +package reporter + +import ( + "time" + + "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" + "go.opentelemetry.io/otel/sdk/metric" +) + +func newMeterProvider() (*metric.MeterProvider, error) { + metricExporter, err := stdoutmetric.New() + if err != nil { + return nil, err + } + + meterProvider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(metricExporter, + // Default is 1m. Set to 3s for demonstrative purposes. + metric.WithInterval(3*time.Second))), + ) + return meterProvider, nil +} diff --git a/reporter/reporter.go b/reporter/reporter.go new file mode 100644 index 00000000..92510471 --- /dev/null +++ b/reporter/reporter.go @@ -0,0 +1,76 @@ +package reporter + +import ( + "context" + "os" + + "go.opentelemetry.io/otel/sdk/metric" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +type Fields map[string]any + +// Reporter is the higher level abstraction over logging, tracing +// and metrics. +type Reporter interface { + Info(ctx context.Context, msg string, fields ...Fields) + Debug(ctx context.Context, msg string, fields ...Fields) + Warn(ctx context.Context, msg string, fields ...Fields) + Error(ctx context.Context, msg string, err error, fields ...Fields) + + MeterProvider() *metric.MeterProvider +} + +func New() (Reporter, error) { + logger, err := setupLogger() + if err != nil { + return nil, err + } + + metricProvider, err := newMeterProvider() + if err != nil { + return nil, err + } + + return &AppReporter{ + logger: logger, + metricProvider: metricProvider, + }, nil +} + +type AppReporter struct { + logger *zap.Logger + + metricProvider *metric.MeterProvider +} + +func setupLogger() (*zap.Logger, error) { + logger := zap.New( + zapcore.NewTee( + // keeping this commented out in case we want both the OTEL logs and the simplified logs + zapcore.NewCore(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), zapcore.AddSync(os.Stdout), zapcore.InfoLevel), + ), + ) + return logger, nil +} + +func (r *AppReporter) MeterProvider() *metric.MeterProvider { + return r.metricProvider +} + +func (r *AppReporter) Info(ctx context.Context, msg string, fields ...Fields) { + r.logger.With(toZapFields(getFields(ctx))...).Info(msg) +} + +func (r *AppReporter) Debug(ctx context.Context, msg string, fields ...Fields) { + r.logger.With(toZapFields(getFields(ctx))...).Debug(msg) +} + +func (r *AppReporter) Warn(ctx context.Context, msg string, fields ...Fields) { + r.logger.With(toZapFields(getFields(ctx))...).Warn(msg) +} + +func (r *AppReporter) Error(ctx context.Context, msg string, err error, fields ...Fields) { + r.logger.With(toZapFields(getFields(ctx))...).Error(msg, zap.Error(err)) +} -- GitLab From 1938b88647134d0b5fd28898bf7cec8a7f69d7eb Mon Sep 17 00:00:00 2001 From: e_forbes Date: Thu, 23 Oct 2025 18:01:38 +0100 Subject: [PATCH 2/4] Updateroonis --- {reporter => grpc}/grpc.go | 7 +++--- reporter/context.go | 41 ----------------------------------- reporter/reporter.go | 44 -------------------------------------- 3 files changed, 4 insertions(+), 88 deletions(-) rename {reporter => grpc}/grpc.go (84%) delete mode 100644 reporter/context.go diff --git a/reporter/grpc.go b/grpc/grpc.go similarity index 84% rename from reporter/grpc.go rename to grpc/grpc.go index 87e40664..c017f0cf 100644 --- a/reporter/grpc.go +++ b/grpc/grpc.go @@ -1,14 +1,15 @@ -package reporter +package grpc import ( + "gitlab.com/gitlab-org/labkit/reporter" "go.opentelemetry.io/otel/sdk/metric" "google.golang.org/grpc" "google.golang.org/grpc/stats/opentelemetry" ) -func NewInstrumentedgRPCClient( +func NewCLient( target string, - reporter Reporter, + reporter reporter.Reporter, opts ...grpc.DialOption, ) (*grpc.ClientConn, error) { dialOption := otelDialOption(reporter.MeterProvider()) diff --git a/reporter/context.go b/reporter/context.go deleted file mode 100644 index 320c3621..00000000 --- a/reporter/context.go +++ /dev/null @@ -1,41 +0,0 @@ -package reporter - -import ( - "context" - "maps" - - "go.uber.org/zap" -) - -type fieldsKey struct{} - -func getFields(ctx context.Context) Fields { - if val, ok := ctx.Value(fieldsKey{}).(Fields); ok { - return val - } - return Fields{} -} - -func toZapFields(fields ...Fields) []zap.Field { - zapFields := []zap.Field{} - - for _, fieldMap := range fields { - for k, v := range fieldMap { - zapFields = append(zapFields, zap.String(k, v.(string))) - } - } - - return zapFields -} - -func WithFields(ctx context.Context, fieldsNew ...Fields) context.Context { - fields := Fields{} - - maps.Copy(fields, getFields(ctx)) - - for _, fieldMap := range fieldsNew { - maps.Copy(fields, fieldMap) - } - - return context.WithValue(ctx, fieldsKey{}, fields) -} diff --git a/reporter/reporter.go b/reporter/reporter.go index 92510471..7a8e5d83 100644 --- a/reporter/reporter.go +++ b/reporter/reporter.go @@ -1,12 +1,7 @@ package reporter import ( - "context" - "os" - "go.opentelemetry.io/otel/sdk/metric" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) type Fields map[string]any @@ -14,63 +9,24 @@ type Fields map[string]any // Reporter is the higher level abstraction over logging, tracing // and metrics. type Reporter interface { - Info(ctx context.Context, msg string, fields ...Fields) - Debug(ctx context.Context, msg string, fields ...Fields) - Warn(ctx context.Context, msg string, fields ...Fields) - Error(ctx context.Context, msg string, err error, fields ...Fields) - MeterProvider() *metric.MeterProvider } func New() (Reporter, error) { - logger, err := setupLogger() - if err != nil { - return nil, err - } - metricProvider, err := newMeterProvider() if err != nil { return nil, err } return &AppReporter{ - logger: logger, metricProvider: metricProvider, }, nil } type AppReporter struct { - logger *zap.Logger - metricProvider *metric.MeterProvider } -func setupLogger() (*zap.Logger, error) { - logger := zap.New( - zapcore.NewTee( - // keeping this commented out in case we want both the OTEL logs and the simplified logs - zapcore.NewCore(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), zapcore.AddSync(os.Stdout), zapcore.InfoLevel), - ), - ) - return logger, nil -} - func (r *AppReporter) MeterProvider() *metric.MeterProvider { return r.metricProvider } - -func (r *AppReporter) Info(ctx context.Context, msg string, fields ...Fields) { - r.logger.With(toZapFields(getFields(ctx))...).Info(msg) -} - -func (r *AppReporter) Debug(ctx context.Context, msg string, fields ...Fields) { - r.logger.With(toZapFields(getFields(ctx))...).Debug(msg) -} - -func (r *AppReporter) Warn(ctx context.Context, msg string, fields ...Fields) { - r.logger.With(toZapFields(getFields(ctx))...).Warn(msg) -} - -func (r *AppReporter) Error(ctx context.Context, msg string, err error, fields ...Fields) { - r.logger.With(toZapFields(getFields(ctx))...).Error(msg, zap.Error(err)) -} -- GitLab From a309c8fbeb250d50a7011c50a0b7c6b272d0697f Mon Sep 17 00:00:00 2001 From: e_forbes Date: Thu, 23 Oct 2025 18:02:41 +0100 Subject: [PATCH 3/4] Typo --- grpc/grpc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grpc/grpc.go b/grpc/grpc.go index c017f0cf..f0e835b2 100644 --- a/grpc/grpc.go +++ b/grpc/grpc.go @@ -7,7 +7,7 @@ import ( "google.golang.org/grpc/stats/opentelemetry" ) -func NewCLient( +func NewClient( target string, reporter reporter.Reporter, opts ...grpc.DialOption, -- GitLab From a41973188ffd9f7e00314b7e49c47ed5ec8485ed Mon Sep 17 00:00:00 2001 From: e_forbes Date: Thu, 23 Oct 2025 18:04:30 +0100 Subject: [PATCH 4/4] Removed unused type alias --- reporter/reporter.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/reporter/reporter.go b/reporter/reporter.go index 7a8e5d83..db1b54a8 100644 --- a/reporter/reporter.go +++ b/reporter/reporter.go @@ -4,8 +4,6 @@ import ( "go.opentelemetry.io/otel/sdk/metric" ) -type Fields map[string]any - // Reporter is the higher level abstraction over logging, tracing // and metrics. type Reporter interface { -- GitLab