diff --git a/cmd/cart/checkout_server.go b/cmd/cart/checkout_server.go index c1ad53c..7d41e9a 100644 --- a/cmd/cart/checkout_server.go +++ b/cmd/cart/checkout_server.go @@ -59,7 +59,7 @@ func (a *App) HandleCheckoutRequests(amqpUrl string, mux *http.ServeMux) { w.WriteHeader(http.StatusInternalServerError) return } - err = a.klarnaClient.AcknowledgeOrder(orderId) + err = a.klarnaClient.AcknowledgeOrder(r.Context(), orderId) if err != nil { log.Printf("Error acknowledging order: %v\n", err) } diff --git a/cmd/cart/klarna-client.go b/cmd/cart/klarna-client.go index 74bd837..975633d 100644 --- a/cmd/cart/klarna-client.go +++ b/cmd/cart/klarna-client.go @@ -1,6 +1,7 @@ package main import ( + "context" "encoding/json" "fmt" "io" @@ -64,13 +65,13 @@ func (k *KlarnaClient) getOrderResponse(res *http.Response) (*CheckoutOrder, err return nil, fmt.Errorf("%s", res.Status) } -func (k *KlarnaClient) CreateOrder(reader io.Reader) (*CheckoutOrder, error) { +func (k *KlarnaClient) CreateOrder(ctx context.Context, reader io.Reader) (*CheckoutOrder, error) { //bytes.NewReader(reply.Payload) req, err := http.NewRequest("POST", k.Url+"/checkout/v3/orders", reader) if err != nil { return nil, err } - + req.WithContext(ctx) req.Header.Add("Content-Type", "application/json") req.SetBasicAuth(k.UserName, k.Password) @@ -82,13 +83,14 @@ func (k *KlarnaClient) CreateOrder(reader io.Reader) (*CheckoutOrder, error) { return k.getOrderResponse(res) } -func (k *KlarnaClient) UpdateOrder(orderId string, reader io.Reader) (*CheckoutOrder, error) { +func (k *KlarnaClient) UpdateOrder(ctx context.Context, orderId string, reader io.Reader) (*CheckoutOrder, error) { //bytes.NewReader(reply.Payload) req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkout/v3/orders/%s", k.Url, orderId), reader) if err != nil { return nil, err } + req.WithContext(ctx) req.Header.Add("Content-Type", "application/json") req.SetBasicAuth(k.UserName, k.Password) @@ -100,12 +102,12 @@ func (k *KlarnaClient) UpdateOrder(orderId string, reader io.Reader) (*CheckoutO return k.getOrderResponse(res) } -func (k *KlarnaClient) AbortOrder(orderId string) error { +func (k *KlarnaClient) AbortOrder(ctx context.Context, orderId string) error { req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkout/v3/orders/%s/abort", k.Url, orderId), nil) if err != nil { return err } - + req.WithContext(ctx) req.SetBasicAuth(k.UserName, k.Password) _, err = http.DefaultClient.Do(req) @@ -113,11 +115,12 @@ func (k *KlarnaClient) AbortOrder(orderId string) error { } // ordermanagement/v1/orders/{order_id}/acknowledge -func (k *KlarnaClient) AcknowledgeOrder(orderId string) error { +func (k *KlarnaClient) AcknowledgeOrder(ctx context.Context, orderId string) error { req, err := http.NewRequest("POST", fmt.Sprintf("%s/ordermanagement/v1/orders/%s/acknowledge", k.Url, orderId), nil) if err != nil { return err } + req.WithContext(ctx) id := uuid.New() req.SetBasicAuth(k.UserName, k.Password) diff --git a/cmd/cart/pool-server.go b/cmd/cart/pool-server.go index a4e69cf..a6822a7 100644 --- a/cmd/cart/pool-server.go +++ b/cmd/cart/pool-server.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "context" "encoding/json" "fmt" "log" @@ -19,7 +20,7 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "go.opentelemetry.io/contrib/bridges/otelslog" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -65,7 +66,7 @@ func (s *PoolServer) GetCartHandler(w http.ResponseWriter, r *http.Request, id c func (s *PoolServer) AddSkuToCartHandler(w http.ResponseWriter, r *http.Request, id cart.CartId) error { sku := r.PathValue("sku") - msg, err := GetItemAddMessage(sku, 1, getCountryFromHost(r.Host), nil) + msg, err := GetItemAddMessage(r.Context(), sku, 1, getCountryFromHost(r.Host), nil) if err != nil { return err } @@ -197,14 +198,14 @@ type SetCartItems struct { Items []Item `json:"items"` } -func getMultipleAddMessages(items []Item, country string) []proto.Message { +func getMultipleAddMessages(ctx context.Context, items []Item, country string) []proto.Message { wg := sync.WaitGroup{} mu := sync.Mutex{} msgs := make([]proto.Message, 0, len(items)) for _, itm := range items { wg.Go( func() { - msg, err := GetItemAddMessage(itm.Sku, itm.Quantity, country, itm.StoreId) + msg, err := GetItemAddMessage(ctx, itm.Sku, itm.Quantity, country, itm.StoreId) if err != nil { log.Printf("error adding item %s: %v", itm.Sku, err) return @@ -227,7 +228,7 @@ func (s *PoolServer) SetCartItemsHandler(w http.ResponseWriter, r *http.Request, msgs := make([]proto.Message, 0, len(setCartItems.Items)+1) msgs = append(msgs, &messages.ClearCartRequest{}) - msgs = append(msgs, getMultipleAddMessages(setCartItems.Items, setCartItems.Country)...) + msgs = append(msgs, getMultipleAddMessages(r.Context(), setCartItems.Items, setCartItems.Country)...) reply, err := s.ApplyLocal(id, msgs...) if err != nil { @@ -243,7 +244,7 @@ func (s *PoolServer) AddMultipleItemHandler(w http.ResponseWriter, r *http.Reque return err } - reply, err := s.ApplyLocal(id, getMultipleAddMessages(setCartItems.Items, setCartItems.Country)...) + reply, err := s.ApplyLocal(id, getMultipleAddMessages(r.Context(), setCartItems.Items, setCartItems.Country)...) if err != nil { return err } @@ -263,7 +264,7 @@ func (s *PoolServer) AddSkuRequestHandler(w http.ResponseWriter, r *http.Request if err != nil { return err } - msg, err := GetItemAddMessage(addRequest.Sku, int(addRequest.Quantity), addRequest.Country, addRequest.StoreId) + msg, err := GetItemAddMessage(r.Context(), addRequest.Sku, int(addRequest.Quantity), addRequest.Country, addRequest.StoreId) if err != nil { return err } @@ -308,7 +309,7 @@ func getLocale(country string) string { return "sv-se" } -func (s *PoolServer) CreateOrUpdateCheckout(host string, id cart.CartId) (*CheckoutOrder, error) { +func (s *PoolServer) CreateOrUpdateCheckout(ctx context.Context, host string, id cart.CartId) (*CheckoutOrder, error) { country := getCountryFromHost(host) meta := &CheckoutMeta{ Terms: fmt.Sprintf("https://%s/terms", host), @@ -334,9 +335,9 @@ func (s *PoolServer) CreateOrUpdateCheckout(host string, id cart.CartId) (*Check } if grain.OrderReference != "" { - return s.klarnaClient.UpdateOrder(grain.OrderReference, bytes.NewReader(payload)) + return s.klarnaClient.UpdateOrder(ctx, grain.OrderReference, bytes.NewReader(payload)) } else { - return s.klarnaClient.CreateOrder(bytes.NewReader(payload)) + return s.klarnaClient.CreateOrder(ctx, bytes.NewReader(payload)) } } @@ -532,7 +533,7 @@ func (s *PoolServer) CheckoutHandler(fn func(order *CheckoutOrder, w http.Respon return CookieCartIdHandler(s.ProxyHandler(func(w http.ResponseWriter, r *http.Request, cartId cart.CartId) error { orderId := r.URL.Query().Get("order_id") if orderId == "" { - order, err := s.CreateOrUpdateCheckout(r.Host, cartId) + order, err := s.CreateOrUpdateCheckout(r.Context(), r.Host, cartId) if err != nil { return err } @@ -576,7 +577,7 @@ func (s *PoolServer) Serve(mux *http.ServeMux) { // }) handleFunc := func(pattern string, handlerFunc func(http.ResponseWriter, *http.Request)) { - attr := semconv.NewHTTPServer(nil).Route(pattern) + attr := attribute.String("http.route", pattern) mux.HandleFunc(pattern, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { span := trace.SpanFromContext(r.Context()) span.SetAttributes(attr) diff --git a/cmd/cart/product-fetcher.go b/cmd/cart/product-fetcher.go index 6911a1f..a6ab32f 100644 --- a/cmd/cart/product-fetcher.go +++ b/cmd/cart/product-fetcher.go @@ -1,6 +1,7 @@ package main import ( + "context" "encoding/json" "fmt" "net/http" @@ -26,9 +27,14 @@ func getBaseUrl(country string) string { return "http://localhost:8082" } -func FetchItem(sku string, country string) (*index.DataItem, error) { +func FetchItem(ctx context.Context, sku string, country string) (*index.DataItem, error) { baseUrl := getBaseUrl(country) - res, err := http.Get(fmt.Sprintf("%s/api/by-sku/%s", baseUrl, sku)) + req, err := http.NewRequest("GET", fmt.Sprintf("%s/api/by-sku/%s", baseUrl, sku), nil) + req = req.WithContext(ctx) + if err != nil { + return nil, err + } + res, err := http.DefaultClient.Do(req) if err != nil { return nil, err } @@ -38,8 +44,8 @@ func FetchItem(sku string, country string) (*index.DataItem, error) { return &item, err } -func GetItemAddMessage(sku string, qty int, country string, storeId *string) (*messages.AddItem, error) { - item, err := FetchItem(sku, country) +func GetItemAddMessage(ctx context.Context, sku string, qty int, country string, storeId *string) (*messages.AddItem, error) { + item, err := FetchItem(ctx, sku, country) if err != nil { return nil, err } diff --git a/go.mod b/go.mod index c6e49c9..5414d21 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( go.opentelemetry.io/otel/sdk v1.38.0 go.opentelemetry.io/otel/sdk/log v0.14.0 go.opentelemetry.io/otel/sdk/metric v1.38.0 + go.opentelemetry.io/otel/trace v1.38.0 google.golang.org/grpc v1.76.0 google.golang.org/protobuf v1.36.10 k8s.io/api v0.34.1 @@ -85,7 +86,6 @@ require ( go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect - go.opentelemetry.io/otel/trace v1.38.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect