do all requests with context
All checks were successful
Build and Publish / Metadata (push) Successful in 14s
Build and Publish / BuildAndDeployAmd64 (push) Successful in 50s
Build and Publish / BuildAndDeployArm64 (push) Successful in 4m22s

This commit is contained in:
matst80
2025-11-05 19:04:56 +01:00
parent 01d8d86c7c
commit 81e2fb5faa
5 changed files with 34 additions and 24 deletions

View File

@@ -59,7 +59,7 @@ func (a *App) HandleCheckoutRequests(amqpUrl string, mux *http.ServeMux) {
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
err = a.klarnaClient.AcknowledgeOrder(orderId) err = a.klarnaClient.AcknowledgeOrder(r.Context(), orderId)
if err != nil { if err != nil {
log.Printf("Error acknowledging order: %v\n", err) log.Printf("Error acknowledging order: %v\n", err)
} }

View File

@@ -1,6 +1,7 @@
package main package main
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
@@ -64,13 +65,13 @@ func (k *KlarnaClient) getOrderResponse(res *http.Response) (*CheckoutOrder, err
return nil, fmt.Errorf("%s", res.Status) 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) //bytes.NewReader(reply.Payload)
req, err := http.NewRequest("POST", k.Url+"/checkout/v3/orders", reader) req, err := http.NewRequest("POST", k.Url+"/checkout/v3/orders", reader)
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.WithContext(ctx)
req.Header.Add("Content-Type", "application/json") req.Header.Add("Content-Type", "application/json")
req.SetBasicAuth(k.UserName, k.Password) req.SetBasicAuth(k.UserName, k.Password)
@@ -82,13 +83,14 @@ func (k *KlarnaClient) CreateOrder(reader io.Reader) (*CheckoutOrder, error) {
return k.getOrderResponse(res) 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) //bytes.NewReader(reply.Payload)
req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkout/v3/orders/%s", k.Url, orderId), reader) req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkout/v3/orders/%s", k.Url, orderId), reader)
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.WithContext(ctx)
req.Header.Add("Content-Type", "application/json") req.Header.Add("Content-Type", "application/json")
req.SetBasicAuth(k.UserName, k.Password) req.SetBasicAuth(k.UserName, k.Password)
@@ -100,12 +102,12 @@ func (k *KlarnaClient) UpdateOrder(orderId string, reader io.Reader) (*CheckoutO
return k.getOrderResponse(res) 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) req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkout/v3/orders/%s/abort", k.Url, orderId), nil)
if err != nil { if err != nil {
return err return err
} }
req.WithContext(ctx)
req.SetBasicAuth(k.UserName, k.Password) req.SetBasicAuth(k.UserName, k.Password)
_, err = http.DefaultClient.Do(req) _, err = http.DefaultClient.Do(req)
@@ -113,11 +115,12 @@ func (k *KlarnaClient) AbortOrder(orderId string) error {
} }
// ordermanagement/v1/orders/{order_id}/acknowledge // 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) req, err := http.NewRequest("POST", fmt.Sprintf("%s/ordermanagement/v1/orders/%s/acknowledge", k.Url, orderId), nil)
if err != nil { if err != nil {
return err return err
} }
req.WithContext(ctx)
id := uuid.New() id := uuid.New()
req.SetBasicAuth(k.UserName, k.Password) req.SetBasicAuth(k.UserName, k.Password)

View File

@@ -2,6 +2,7 @@ package main
import ( import (
"bytes" "bytes"
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"log" "log"
@@ -19,7 +20,7 @@ import (
"github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promauto"
"go.opentelemetry.io/contrib/bridges/otelslog" "go.opentelemetry.io/contrib/bridges/otelslog"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "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"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace" "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 { func (s *PoolServer) AddSkuToCartHandler(w http.ResponseWriter, r *http.Request, id cart.CartId) error {
sku := r.PathValue("sku") 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 { if err != nil {
return err return err
} }
@@ -197,14 +198,14 @@ type SetCartItems struct {
Items []Item `json:"items"` 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{} wg := sync.WaitGroup{}
mu := sync.Mutex{} mu := sync.Mutex{}
msgs := make([]proto.Message, 0, len(items)) msgs := make([]proto.Message, 0, len(items))
for _, itm := range items { for _, itm := range items {
wg.Go( wg.Go(
func() { 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 { if err != nil {
log.Printf("error adding item %s: %v", itm.Sku, err) log.Printf("error adding item %s: %v", itm.Sku, err)
return 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 := make([]proto.Message, 0, len(setCartItems.Items)+1)
msgs = append(msgs, &messages.ClearCartRequest{}) 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...) reply, err := s.ApplyLocal(id, msgs...)
if err != nil { if err != nil {
@@ -243,7 +244,7 @@ func (s *PoolServer) AddMultipleItemHandler(w http.ResponseWriter, r *http.Reque
return err 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 { if err != nil {
return err return err
} }
@@ -263,7 +264,7 @@ func (s *PoolServer) AddSkuRequestHandler(w http.ResponseWriter, r *http.Request
if err != nil { if err != nil {
return err 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 { if err != nil {
return err return err
} }
@@ -308,7 +309,7 @@ func getLocale(country string) string {
return "sv-se" 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) country := getCountryFromHost(host)
meta := &CheckoutMeta{ meta := &CheckoutMeta{
Terms: fmt.Sprintf("https://%s/terms", host), Terms: fmt.Sprintf("https://%s/terms", host),
@@ -334,9 +335,9 @@ func (s *PoolServer) CreateOrUpdateCheckout(host string, id cart.CartId) (*Check
} }
if grain.OrderReference != "" { if grain.OrderReference != "" {
return s.klarnaClient.UpdateOrder(grain.OrderReference, bytes.NewReader(payload)) return s.klarnaClient.UpdateOrder(ctx, grain.OrderReference, bytes.NewReader(payload))
} else { } 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 { return CookieCartIdHandler(s.ProxyHandler(func(w http.ResponseWriter, r *http.Request, cartId cart.CartId) error {
orderId := r.URL.Query().Get("order_id") orderId := r.URL.Query().Get("order_id")
if orderId == "" { if orderId == "" {
order, err := s.CreateOrUpdateCheckout(r.Host, cartId) order, err := s.CreateOrUpdateCheckout(r.Context(), r.Host, cartId)
if err != nil { if err != nil {
return err return err
} }
@@ -576,7 +577,7 @@ func (s *PoolServer) Serve(mux *http.ServeMux) {
// }) // })
handleFunc := func(pattern string, handlerFunc func(http.ResponseWriter, *http.Request)) { 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) { mux.HandleFunc(pattern, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
span := trace.SpanFromContext(r.Context()) span := trace.SpanFromContext(r.Context())
span.SetAttributes(attr) span.SetAttributes(attr)

View File

@@ -1,6 +1,7 @@
package main package main
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
@@ -26,9 +27,14 @@ func getBaseUrl(country string) string {
return "http://localhost:8082" 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) 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 { if err != nil {
return nil, err return nil, err
} }
@@ -38,8 +44,8 @@ func FetchItem(sku string, country string) (*index.DataItem, error) {
return &item, err return &item, err
} }
func GetItemAddMessage(sku string, qty int, country string, storeId *string) (*messages.AddItem, error) { func GetItemAddMessage(ctx context.Context, sku string, qty int, country string, storeId *string) (*messages.AddItem, error) {
item, err := FetchItem(sku, country) item, err := FetchItem(ctx, sku, country)
if err != nil { if err != nil {
return nil, err return nil, err
} }

2
go.mod
View File

@@ -19,6 +19,7 @@ require (
go.opentelemetry.io/otel/sdk v1.38.0 go.opentelemetry.io/otel/sdk v1.38.0
go.opentelemetry.io/otel/sdk/log v0.14.0 go.opentelemetry.io/otel/sdk/log v0.14.0
go.opentelemetry.io/otel/sdk/metric v1.38.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/grpc v1.76.0
google.golang.org/protobuf v1.36.10 google.golang.org/protobuf v1.36.10
k8s.io/api v0.34.1 k8s.io/api v0.34.1
@@ -85,7 +86,6 @@ require (
go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // 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/metric v1.38.0 // indirect
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect