[hw-7] add metrics, tracing

This commit is contained in:
Никита Шубин
2025-07-26 14:15:40 +00:00
parent 342bd3f726
commit 4396bebe80
38 changed files with 717 additions and 36 deletions

View File

@@ -6,6 +6,7 @@ import (
"route256/cart/internal/domain/entity"
"route256/cart/internal/domain/model"
"route256/cart/internal/infra/http/metrics"
)
type storage = map[entity.UID]*entity.Cart
@@ -34,6 +35,7 @@ func (r *InMemoryRepository) AddItem(_ context.Context, userID entity.UID, item
}
r.storage[userID] = cart
metrics.SetInMemoryObjects(len(r.storage))
}
if _, ok := cart.ItemCount[item.Product.Sku]; !ok {
@@ -112,6 +114,7 @@ func (r *InMemoryRepository) DeleteItemsByUserID(_ context.Context, userID entit
_, ok := r.storage[userID]
if ok {
delete(r.storage, userID)
metrics.SetInMemoryObjects(len(r.storage))
}
return nil

View File

@@ -7,6 +7,7 @@ import (
"route256/cart/internal/domain/entity"
"route256/cart/internal/domain/model"
"route256/cart/internal/infra/tracing"
)
//go:generate minimock -i Repository -o ./mock -s _mock.go
@@ -43,6 +44,9 @@ func NewCartService(repository Repository, productService ProductService, lomsSe
}
func (s *CartService) AddItem(ctx context.Context, userID entity.UID, item *model.Item) error {
ctx, span := tracing.Tracer().Start(ctx, "AddItem")
defer span.End()
if err := item.Validate(); err != nil {
return fmt.Errorf("invalid requested values: %w", err)
}
@@ -76,6 +80,9 @@ func (s *CartService) AddItem(ctx context.Context, userID entity.UID, item *mode
// and return a list of the collected items.
// In case of failed request to product-service, return nothing and error.
func (s *CartService) GetItemsByUserID(ctx context.Context, userID entity.UID) (*model.Cart, error) {
ctx, span := tracing.Tracer().Start(ctx, "GetItemsByUserID")
defer span.End()
if userID <= 0 {
return nil, fmt.Errorf("userID invalid")
}
@@ -122,6 +129,9 @@ func (s *CartService) GetItemsByUserID(ctx context.Context, userID entity.UID) (
}
func (s *CartService) DeleteItem(ctx context.Context, userID entity.UID, sku entity.Sku) error {
ctx, span := tracing.Tracer().Start(ctx, "DeleteItem")
defer span.End()
if userID <= 0 {
return fmt.Errorf("userID invalid")
}
@@ -138,6 +148,9 @@ func (s *CartService) DeleteItem(ctx context.Context, userID entity.UID, sku ent
}
func (s *CartService) DeleteItemsByUserID(ctx context.Context, userID entity.UID) error {
ctx, span := tracing.Tracer().Start(ctx, "DeleteItemsByUserID")
defer span.End()
if userID <= 0 {
return fmt.Errorf("userID invalid")
}
@@ -150,6 +163,9 @@ func (s *CartService) DeleteItemsByUserID(ctx context.Context, userID entity.UID
}
func (s *CartService) CheckoutUserCart(ctx context.Context, userID entity.UID) (int64, error) {
ctx, span := tracing.Tracer().Start(ctx, "CheckoutUserCart")
defer span.End()
if userID <= 0 {
return 0, fmt.Errorf("userID invalid")
}

View File

@@ -119,7 +119,8 @@ func TestCartService_AddItem(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
AddItemMock.
Expect(ctx, 1337, &testItem).
ExpectUserIDParam2(1337).
ExpectItemParam3(&testItem).
Return(nil),
productService: &productServiceFake{},
lomsService: &lomsServiceFake{},
@@ -190,7 +191,8 @@ func TestCartService_AddItem(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
AddItemMock.
Expect(ctx, 1337, &testItem).
ExpectUserIDParam2(1337).
ExpectItemParam3(&testItem).
Return(assert.AnError),
productService: &productServiceFake{},
lomsService: &lomsServiceFake{},
@@ -304,7 +306,7 @@ func TestCartService_GetItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(testEntityCart, nil),
productService: &productServiceFake{},
},
@@ -320,7 +322,7 @@ func TestCartService_GetItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(entity.Cart{
UserID: testUID,
Items: []entity.Sku{testSKU},
@@ -353,7 +355,7 @@ func TestCartService_GetItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(entity.Cart{
UserID: testUID,
Items: []entity.Sku{testSKU, 1},
@@ -407,7 +409,7 @@ func TestCartService_GetItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(entity.Cart{}, assert.AnError),
productService: nil,
},
@@ -423,7 +425,7 @@ func TestCartService_GetItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(entity.Cart{}, nil),
productService: nil,
},
@@ -439,7 +441,7 @@ func TestCartService_GetItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(entity.Cart{
UserID: testUID,
Items: []entity.Sku{2},
@@ -459,7 +461,7 @@ func TestCartService_GetItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(entity.Cart{
UserID: testUID,
Items: []entity.Sku{2},
@@ -522,7 +524,8 @@ func TestCartService_DeleteItem(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
DeleteItemMock.
Expect(ctx, testUID, testSKU).
ExpectUserIDParam2(testUID).
ExpectSkuParam3(testSKU).
Return(nil),
},
args: args{
@@ -561,7 +564,8 @@ func TestCartService_DeleteItem(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
DeleteItemMock.
Expect(ctx, testUID, testSKU).
ExpectUserIDParam2(testUID).
ExpectSkuParam3(testSKU).
Return(assert.AnError),
},
args: args{
@@ -613,7 +617,7 @@ func TestCartService_DeleteItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
DeleteItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(nil),
},
args: args{
@@ -638,7 +642,7 @@ func TestCartService_DeleteItemsByUserID(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
DeleteItemsByUserIDMock.
Expect(ctx, testUID).
ExpectUserIDParam2(testUID).
Return(assert.AnError),
},
args: args{
@@ -697,10 +701,10 @@ func TestCartService_CheckoutUserCart(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, 1337).
ExpectUserIDParam2(1337).
Return(testCart, nil).
DeleteItemsByUserIDMock.
Expect(ctx, 1337).
ExpectUserIDParam2(1337).
Return(nil),
productService: &productServiceFake{},
lomsService: &lomsServiceFake{},
@@ -720,7 +724,7 @@ func TestCartService_CheckoutUserCart(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, 1337).
ExpectUserIDParam2(1337).
Return(entity.Cart{}, assert.AnError),
},
args: args{ctx: ctx, userID: 1337},
@@ -731,7 +735,7 @@ func TestCartService_CheckoutUserCart(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, 1111).
ExpectUserIDParam2(1111).
Return(testCart, nil),
productService: &productServiceFake{},
lomsService: &lomsServiceFake{},
@@ -744,10 +748,10 @@ func TestCartService_CheckoutUserCart(t *testing.T) {
fields: fields{
repository: mock.NewRepositoryMock(mc).
GetItemsByUserIDMock.
Expect(ctx, 1337).
ExpectUserIDParam2(1337).
Return(testCart, nil).
DeleteItemsByUserIDMock.
Expect(ctx, 1337).
ExpectUserIDParam2(1337).
Return(assert.AnError),
productService: &productServiceFake{},
lomsService: &lomsServiceFake{},