From 1fc66eca61a7b39e2994d9ad2cec016af9950f29 Mon Sep 17 00:00:00 2001 From: Tim Wundenberg Date: Sat, 7 Jun 2025 12:07:13 +0200 Subject: [PATCH] feat(observabillity): #115 add traces --- go.mod | 2 + go.sum | 4 ++ internal/default.go | 7 +- internal/handler/account.go | 8 +++ internal/handler/auth.go | 34 +++++++++- internal/handler/{error.go => default.go} | 11 +++ internal/handler/middleware/logger.go | 2 + internal/handler/root_and_404.go | 4 ++ internal/handler/transaction.go | 17 +++++ internal/handler/transaction_recurring.go | 6 ++ internal/handler/treasure_chest.go | 8 +++ internal/otel.go | 81 +++++++++++------------ 12 files changed, 137 insertions(+), 47 deletions(-) rename internal/handler/{error.go => default.go} (73%) diff --git a/go.mod b/go.mod index 368a29d..ea4d5a9 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( go.opentelemetry.io/otel v1.36.0 go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 @@ -43,6 +44,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.2 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect go.opentelemetry.io/otel/trace v1.36.0 // indirect go.opentelemetry.io/proto/otlp v1.6.0 // indirect diff --git a/go.sum b/go.sum index 7d37222..83feb67 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,10 @@ go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5B go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2/go.mod h1:DvPtKE63knkDVP88qpatBj81JxN+w1bqfVbsbCbj1WY= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0 h1:zwdo1gS2eH26Rg+CoqVQpEK1h8gvt5qyU5Kk5Bixvow= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0/go.mod h1:rUKCPscaRWWcqGT6HnEmYrK+YNe5+Sw64xgQTOJ5b30= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 h1:dNzwXjZKpMpE2JhmO+9HsPl42NIXFIFSUSSs0fiqra0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 h1:JgtbA0xkWHnTmYk7YusopJFX6uleBmAuZ8n05NEh8nQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2 h1:12vMqzLLNZtXuXbJhSENRg+Vvx+ynNilV8twBLBsXMY= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2/go.mod h1:ZccPZoPOoq8x3Trik/fCsba7DEYDUnN6yX79pgp2BUQ= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= diff --git a/internal/default.go b/internal/default.go index 60c6ab7..cb91b7a 100644 --- a/internal/default.go +++ b/internal/default.go @@ -48,11 +48,12 @@ func Run(ctx context.Context, database *sqlx.DB, migrationsPrefix string, env fu } defer func() { // User context.Background(), as the main context is already cancelled - ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) err = otelShutdown(ctx) if err != nil { log.L.Error("error shutting down OpenTelemetry SDK", "err", err) } + cancel() }() log.InitOtelLogger() @@ -143,9 +144,7 @@ func createHandler(d *sqlx.DB, serverSettings *types.Settings) http.Handler { middleware.Log, ) - if serverSettings.OtelEnabled { - wrapper = otelhttp.NewHandler(wrapper, "/") - } + wrapper = otelhttp.NewHandler(wrapper, "http.request") return wrapper } diff --git a/internal/handler/account.go b/internal/handler/account.go index 85765c5..3ef2b7f 100644 --- a/internal/handler/account.go +++ b/internal/handler/account.go @@ -36,6 +36,8 @@ func (h AccountImpl) Handle(r *http.ServeMux) { func (h AccountImpl) handleAccountPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -55,6 +57,8 @@ func (h AccountImpl) handleAccountPage() http.HandlerFunc { func (h AccountImpl) handleAccountItemComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -86,6 +90,8 @@ func (h AccountImpl) handleAccountItemComp() http.HandlerFunc { func (h AccountImpl) handleUpdateAccount() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -119,6 +125,8 @@ func (h AccountImpl) handleUpdateAccount() http.HandlerFunc { func (h AccountImpl) handleDeleteAccount() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") diff --git a/internal/handler/auth.go b/internal/handler/auth.go index 2b8bbe8..5dd328b 100644 --- a/internal/handler/auth.go +++ b/internal/handler/auth.go @@ -59,6 +59,8 @@ var ( func (handler AuthImpl) handleSignInPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user != nil { if !user.EmailVerified { @@ -77,6 +79,8 @@ func (handler AuthImpl) handleSignInPage() http.HandlerFunc { func (handler AuthImpl) handleSignIn() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user, err := utils.WaitMinimumTime(securityWaitDuration, func() (*types.User, error) { session := middleware.GetSession(r) email := r.FormValue("email") @@ -112,6 +116,8 @@ func (handler AuthImpl) handleSignIn() http.HandlerFunc { func (handler AuthImpl) handleSignUpPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user != nil { @@ -130,6 +136,8 @@ func (handler AuthImpl) handleSignUpPage() http.HandlerFunc { func (handler AuthImpl) handleSignUpVerifyPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -148,6 +156,8 @@ func (handler AuthImpl) handleSignUpVerifyPage() http.HandlerFunc { func (handler AuthImpl) handleVerifyResendComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -165,6 +175,8 @@ func (handler AuthImpl) handleVerifyResendComp() http.HandlerFunc { func (handler AuthImpl) handleSignUpVerifyResponsePage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + token := r.URL.Query().Get("token") err := handler.service.VerifyUserEmail(token) @@ -185,10 +197,12 @@ func (handler AuthImpl) handleSignUpVerifyResponsePage() http.HandlerFunc { func (handler AuthImpl) handleSignUp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + var email = r.FormValue("email") var password = r.FormValue("password") - _, err := utils.WaitMinimumTime(securityWaitDuration, func() (interface{}, error) { + _, err := utils.WaitMinimumTime(securityWaitDuration, func() (any, error) { log.L.Info("signing up", "email", email) user, err := handler.service.SignUp(email, password) if err != nil { @@ -221,6 +235,8 @@ func (handler AuthImpl) handleSignUp() http.HandlerFunc { func (handler AuthImpl) handleSignOut() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + session := middleware.GetSession(r) if session != nil { @@ -248,6 +264,8 @@ func (handler AuthImpl) handleSignOut() http.HandlerFunc { func (handler AuthImpl) handleDeleteAccountPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -261,6 +279,8 @@ func (handler AuthImpl) handleDeleteAccountPage() http.HandlerFunc { func (handler AuthImpl) handleDeleteAccountComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -285,6 +305,8 @@ func (handler AuthImpl) handleDeleteAccountComp() http.HandlerFunc { func (handler AuthImpl) handleChangePasswordPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + isPasswordReset := r.URL.Query().Has("token") user := middleware.GetUser(r) @@ -301,6 +323,8 @@ func (handler AuthImpl) handleChangePasswordPage() http.HandlerFunc { func (handler AuthImpl) handleChangePasswordComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + session := middleware.GetSession(r) user := middleware.GetUser(r) if session == nil || user == nil { @@ -323,6 +347,8 @@ func (handler AuthImpl) handleChangePasswordComp() http.HandlerFunc { func (handler AuthImpl) handleForgotPasswordPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user != nil { utils.DoRedirect(w, r, "/") @@ -336,13 +362,15 @@ func (handler AuthImpl) handleForgotPasswordPage() http.HandlerFunc { func (handler AuthImpl) handleForgotPasswordComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + email := r.FormValue("email") if email == "" { utils.TriggerToastWithStatus(w, r, "error", "Please enter an email", http.StatusBadRequest) return } - _, err := utils.WaitMinimumTime(securityWaitDuration, func() (interface{}, error) { + _, err := utils.WaitMinimumTime(securityWaitDuration, func() (any, error) { err := handler.service.SendForgotPasswordMail(email) return nil, err }) @@ -357,6 +385,8 @@ func (handler AuthImpl) handleForgotPasswordComp() http.HandlerFunc { func (handler AuthImpl) handleForgotPasswordResponseComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + pageUrl, err := url.Parse(r.Header.Get("Hx-Current-Url")) if err != nil { log.L.Error("Could not get current URL", "err", err) diff --git a/internal/handler/error.go b/internal/handler/default.go similarity index 73% rename from internal/handler/error.go rename to internal/handler/default.go index cbf7a77..4b8bb39 100644 --- a/internal/handler/error.go +++ b/internal/handler/default.go @@ -7,6 +7,9 @@ import ( "spend-sparrow/internal/service" "spend-sparrow/internal/utils" "strings" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) func handleError(w http.ResponseWriter, r *http.Request, err error) { @@ -33,3 +36,11 @@ func extractErrorMessage(err error) string { return strings.SplitN(errMsg, ":", 2)[0] } + +func updateSpan(r *http.Request) { + currentSpan := trace.SpanFromContext(r.Context()) + if currentSpan != nil { + currentSpan.SetAttributes(attribute.String("http.pattern", r.Pattern)) + currentSpan.SetAttributes(attribute.String("http.pattern.id", r.PathValue("id"))) + } +} diff --git a/internal/handler/middleware/logger.go b/internal/handler/middleware/logger.go index 8bddb0c..ba002cb 100644 --- a/internal/handler/middleware/logger.go +++ b/internal/handler/middleware/logger.go @@ -20,6 +20,8 @@ func Log(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() + log.L.Info("request pattern", "pattern", r.Pattern) + wrapped := &WrappedWriter{ ResponseWriter: w, StatusCode: http.StatusOK, diff --git a/internal/handler/root_and_404.go b/internal/handler/root_and_404.go index eab58e6..d346101 100644 --- a/internal/handler/root_and_404.go +++ b/internal/handler/root_and_404.go @@ -29,6 +29,8 @@ func (handler IndexImpl) Handle(router *http.ServeMux) { func (handler IndexImpl) handleRootAnd404() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) var comp templ.Component @@ -52,6 +54,8 @@ func (handler IndexImpl) handleRootAnd404() http.HandlerFunc { func (handler IndexImpl) handleEmpty() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + // Return nothing } } diff --git a/internal/handler/transaction.go b/internal/handler/transaction.go index d335bbf..5dfeff3 100644 --- a/internal/handler/transaction.go +++ b/internal/handler/transaction.go @@ -13,6 +13,8 @@ import ( "github.com/a-h/templ" "github.com/google/uuid" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) type Transaction interface { @@ -45,12 +47,17 @@ func (h TransactionImpl) Handle(r *http.ServeMux) { func (h TransactionImpl) handleTransactionPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") return } + currentSpan := trace.SpanFromContext(r.Context()) + currentSpan.SetAttributes(attribute.String("", "test")) + filter := types.TransactionItemsFilter{ AccountId: r.URL.Query().Get("account-id"), TreasureChestId: r.URL.Query().Get("treasure-chest-id"), @@ -89,12 +96,16 @@ func (h TransactionImpl) handleTransactionPage() http.HandlerFunc { func (h TransactionImpl) handleTransactionItemComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") return } + // log.L.Info("request", "pattern", r.Pattern, "path", r.URL.Path, "method", r.Method, "path", r.URL.Path) + accounts, err := h.account.GetAll(user) if err != nil { handleError(w, r, err) @@ -133,6 +144,8 @@ func (h TransactionImpl) handleTransactionItemComp() http.HandlerFunc { func (h TransactionImpl) handleUpdateTransaction() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -233,6 +246,8 @@ func (h TransactionImpl) handleUpdateTransaction() http.HandlerFunc { func (h TransactionImpl) handleRecalculate() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -251,6 +266,8 @@ func (h TransactionImpl) handleRecalculate() http.HandlerFunc { func (h TransactionImpl) handleDeleteTransaction() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") diff --git a/internal/handler/transaction_recurring.go b/internal/handler/transaction_recurring.go index 4f8392e..6ca659f 100644 --- a/internal/handler/transaction_recurring.go +++ b/internal/handler/transaction_recurring.go @@ -33,6 +33,8 @@ func (h TransactionRecurringImpl) Handle(r *http.ServeMux) { func (h TransactionRecurringImpl) handleTransactionRecurringItemComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -48,6 +50,8 @@ func (h TransactionRecurringImpl) handleTransactionRecurringItemComp() http.Hand func (h TransactionRecurringImpl) handleUpdateTransactionRecurring() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -85,6 +89,8 @@ func (h TransactionRecurringImpl) handleUpdateTransactionRecurring() http.Handle func (h TransactionRecurringImpl) handleDeleteTransactionRecurring() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") diff --git a/internal/handler/treasure_chest.go b/internal/handler/treasure_chest.go index 438fd06..9423eff 100644 --- a/internal/handler/treasure_chest.go +++ b/internal/handler/treasure_chest.go @@ -40,6 +40,8 @@ func (h TreasureChestImpl) Handle(r *http.ServeMux) { func (h TreasureChestImpl) handleTreasureChestPage() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -67,6 +69,8 @@ func (h TreasureChestImpl) handleTreasureChestPage() http.HandlerFunc { func (h TreasureChestImpl) handleTreasureChestItemComp() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -112,6 +116,8 @@ func (h TreasureChestImpl) handleTreasureChestItemComp() http.HandlerFunc { func (h TreasureChestImpl) handleUpdateTreasureChest() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") @@ -155,6 +161,8 @@ func (h TreasureChestImpl) handleUpdateTreasureChest() http.HandlerFunc { func (h TreasureChestImpl) handleDeleteTreasureChest() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + updateSpan(r) + user := middleware.GetUser(r) if user == nil { utils.DoRedirect(w, r, "/auth/signin") diff --git a/internal/otel.go b/internal/otel.go index 5765b15..2ab8815 100644 --- a/internal/otel.go +++ b/internal/otel.go @@ -8,12 +8,16 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" // "go.opentelemetry.io/otel/exporters/stdout/stdoutlog". - // "go.opentelemetry.io/otel/exporters/stdout/stdouttrace". + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" // "go.opentelemetry.io/otel/log/global". - // "go.opentelemetry.io/otel/propagation". + "go.opentelemetry.io/otel/propagation" // "go.opentelemetry.io/otel/sdk/log". "go.opentelemetry.io/otel/sdk/metric" - // "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/sdk/trace" +) + +var ( + otelEndpoint = "192.168.188.155:4317" ) // setupOTelSDK bootstraps the OpenTelemetry pipeline. @@ -40,17 +44,17 @@ func setupOTelSDK(ctx context.Context) (func(context.Context) error, error) { } // Set up propagator. - // prop := newPropagator() - // otel.SetTextMapPropagator(prop) + prop := newPropagator() + otel.SetTextMapPropagator(prop) // Set up trace provider. - // tracerProvider, err := newTracerProvider() - // if err != nil { - // handleErr(err) - // return - // } - // shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown) - // otel.SetTracerProvider(tracerProvider) + tracerProvider, err := newTracerProvider(ctx) + if err != nil { + handleErr(ctx, err) + return nil, err + } + shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown) + otel.SetTracerProvider(tracerProvider) // Set up meter provider. meterProvider, err := newMeterProvider(ctx) @@ -73,42 +77,37 @@ func setupOTelSDK(ctx context.Context) (func(context.Context) error, error) { return shutdown, nil } -// func newPropagator() propagation.TextMapPropagator { -// return propagation.NewCompositeTextMapPropagator( -// propagation.TraceContext{}, -// propagation.Baggage{}, -// ) -// } +func newPropagator() propagation.TextMapPropagator { + return propagation.NewCompositeTextMapPropagator( + propagation.TraceContext{}, + propagation.Baggage{}, + ) +} -// func newTracerProvider() (*trace.TracerProvider, error) { -// traceExporter, err := stdouttrace.New( -// stdouttrace.WithPrettyPrint()) -// if err != nil { -// return nil, err -// } -// -// tracerProvider := trace.NewTracerProvider( -// trace.WithBatcher(traceExporter, -// // Default is 5s. Set to 1s for demonstrative purposes. -// trace.WithBatchTimeout(time.Second)), -// ) -// return tracerProvider, nil -// } - -func newMeterProvider(ctx context.Context) (*metric.MeterProvider, error) { - exp, err := otlpmetricgrpc.New(ctx, - otlpmetricgrpc.WithInsecure(), - otlpmetricgrpc.WithEndpoint("192.168.188.155:4317")) +func newTracerProvider(ctx context.Context) (*trace.TracerProvider, error) { + exp, err := otlptracegrpc.New(ctx, + otlptracegrpc.WithEndpoint(otelEndpoint), + otlptracegrpc.WithInsecure(), + ) if err != nil { return nil, err } - meterProvider := metric.NewMeterProvider( + return trace.NewTracerProvider(trace.WithBatcher(exp)), nil +} + +func newMeterProvider(ctx context.Context) (*metric.MeterProvider, error) { + exp, err := otlpmetricgrpc.New(ctx, + otlpmetricgrpc.WithInsecure(), + otlpmetricgrpc.WithEndpoint(otelEndpoint)) + if err != nil { + return nil, err + } + + return metric.NewMeterProvider( metric.WithReader( metric.NewPeriodicReader( - exp, metric.WithInterval(15*time.Second)))) - - return meterProvider, nil + exp, metric.WithInterval(15*time.Second)))), nil } // func newLoggerProvider() (*log.LoggerProvider, error) {