Skip to content

Commit a88e7e5

Browse files
Merge pull request #26 from DoWithLogic/feat/observability
♿️ : add trace span on every layer application
2 parents 4d3c4ad + 77324c7 commit a88e7e5

File tree

5 files changed

+51
-16
lines changed

5 files changed

+51
-16
lines changed

internal/users/repository/repository.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/DoWithLogic/golang-clean-architecture/internal/users/entities"
99
"github.com/DoWithLogic/golang-clean-architecture/internal/users/repository/repository_query"
1010
"github.com/DoWithLogic/golang-clean-architecture/pkg/datasource"
11+
"github.com/DoWithLogic/golang-clean-architecture/pkg/observability/instrumentation"
1112
"github.com/DoWithLogic/golang-clean-architecture/pkg/utils"
1213
"github.com/jmoiron/sqlx"
1314
)
@@ -40,6 +41,9 @@ func (r *repository) Atomic(ctx context.Context, opt *sql.TxOptions, repo func(t
4041
}
4142

4243
func (repo *repository) SaveNewUser(ctx context.Context, user entities.User) (userID int64, err error) {
44+
ctx, span := instrumentation.NewTraceSpan(ctx, "SaveNewUserRepo")
45+
defer span.End()
46+
4347
args := utils.Array{
4448
user.Email,
4549
user.Password,
@@ -59,6 +63,9 @@ func (repo *repository) SaveNewUser(ctx context.Context, user entities.User) (us
5963
}
6064

6165
func (repo *repository) UpdateUserByID(ctx context.Context, user entities.UpdateUser) error {
66+
ctx, span := instrumentation.NewTraceSpan(ctx, "UpdateUserByIDRepo")
67+
defer span.End()
68+
6269
args := utils.Array{
6370
user.Fullname, user.Fullname,
6471
user.PhoneNumber, user.PhoneNumber,
@@ -76,6 +83,9 @@ func (repo *repository) UpdateUserByID(ctx context.Context, user entities.Update
7683
}
7784

7885
func (repo *repository) GetUserByID(ctx context.Context, userID int64, options ...entities.LockingOpt) (userData entities.User, err error) {
86+
ctx, span := instrumentation.NewTraceSpan(ctx, "GetUserByIDRepo")
87+
defer span.End()
88+
7989
args := utils.Array{
8090
userID,
8191
}
@@ -106,6 +116,9 @@ func (repo *repository) GetUserByID(ctx context.Context, userID int64, options .
106116
}
107117

108118
func (repo *repository) UpdateUserStatusByID(ctx context.Context, req entities.UpdateUserStatus) error {
119+
ctx, span := instrumentation.NewTraceSpan(ctx, "UpdateUserStatusByIDRepo")
120+
defer span.End()
121+
109122
args := utils.Array{
110123
req.IsActive,
111124
req.UpdatedAt,
@@ -122,6 +135,9 @@ func (repo *repository) UpdateUserStatusByID(ctx context.Context, req entities.U
122135
}
123136

124137
func (repo *repository) IsUserExist(ctx context.Context, email string) bool {
138+
ctx, span := instrumentation.NewTraceSpan(ctx, "IsUserExistRepo")
139+
defer span.End()
140+
125141
args := utils.Array{email}
126142

127143
var id int64
@@ -140,6 +156,9 @@ func (repo *repository) IsUserExist(ctx context.Context, email string) bool {
140156
}
141157

142158
func (repo *repository) GetUserByEmail(ctx context.Context, email string) (userData entities.User, err error) {
159+
ctx, span := instrumentation.NewTraceSpan(ctx, "GetUserByEmailRepo")
160+
defer span.End()
161+
143162
args := utils.Array{
144163
email,
145164
}

internal/users/usecase/usecase.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/DoWithLogic/golang-clean-architecture/pkg/app_crypto"
1414
"github.com/DoWithLogic/golang-clean-architecture/pkg/app_jwt"
1515
"github.com/DoWithLogic/golang-clean-architecture/pkg/apperror"
16+
"github.com/DoWithLogic/golang-clean-architecture/pkg/observability/instrumentation"
1617
"github.com/golang-jwt/jwt"
1718
)
1819

@@ -29,6 +30,9 @@ func NewUseCase(repo users.Repository, appJwt *app_jwt.JWT, crypto *app_crypto.C
2930
}
3031

3132
func (uc *usecase) Login(ctx context.Context, request dtos.UserLoginRequest) (response dtos.UserLoginResponse, err error) {
33+
ctx, span := instrumentation.NewTraceSpan(ctx, "LoginUC")
34+
defer span.End()
35+
3236
dataLogin, err := uc.repo.GetUserByEmail(ctx, request.Email)
3337
if err != nil {
3438
return response, apperror.InternalServerError(err)
@@ -58,6 +62,9 @@ func (uc *usecase) Login(ctx context.Context, request dtos.UserLoginRequest) (re
5862
}
5963

6064
func (uc *usecase) Create(ctx context.Context, payload dtos.CreateUserRequest) (userID int64, err error) {
65+
ctx, span := instrumentation.NewTraceSpan(ctx, "CreateUC")
66+
defer span.End()
67+
6168
if exist := uc.repo.IsUserExist(ctx, payload.Email); exist {
6269
return userID, apperror.Conflict(apperror.ErrEmailAlreadyExist)
6370
}
@@ -72,6 +79,9 @@ func (uc *usecase) Create(ctx context.Context, payload dtos.CreateUserRequest) (
7279
}
7380

7481
func (uc *usecase) PartialUpdate(ctx context.Context, data dtos.UpdateUserRequest) error {
82+
ctx, span := instrumentation.NewTraceSpan(ctx, "PartialUpdateUC")
83+
defer span.End()
84+
7585
return uc.repo.Atomic(ctx, &sql.TxOptions{}, func(tx users.Repository) error {
7686
opt := entities.LockingOpt{
7787
PessimisticLocking: true,
@@ -86,6 +96,9 @@ func (uc *usecase) PartialUpdate(ctx context.Context, data dtos.UpdateUserReques
8696
}
8797

8898
func (uc *usecase) UpdateStatus(ctx context.Context, req dtos.UpdateUserStatusRequest) error {
99+
ctx, span := instrumentation.NewTraceSpan(ctx, "UpdateStatusUC")
100+
defer span.End()
101+
89102
if _, err := uc.repo.GetUserByID(ctx, req.UserID, entities.LockingOpt{}); err != nil {
90103
return err
91104
}
@@ -94,6 +107,9 @@ func (uc *usecase) UpdateStatus(ctx context.Context, req dtos.UpdateUserStatusRe
94107
}
95108

96109
func (uc *usecase) Detail(ctx context.Context, id int64) (detail dtos.UserDetailResponse, err error) {
110+
ctx, span := instrumentation.NewTraceSpan(ctx, "DetailUC")
111+
defer span.End()
112+
97113
userDetail, err := uc.repo.GetUserByID(ctx, id)
98114
if err != nil {
99115
return detail, apperror.InternalServerError(err)

internal/users/usecase/usecase_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func Test_usecase_CreateUser(t *testing.T) {
5858

5959
crypto := app_crypto.NewCrypto(KeyUnitTest)
6060
appJwt := app_jwt.NewJWT(config.JWTConfig{Key: KeyUnitTest, Expired: 60, Label: "XXXX"})
61-
ctx := context.Background()
61+
ctx := context.TODO()
6262
repo := mocks.NewMockRepository(ctrl)
6363
uc := usecase.NewUseCase(
6464
repo,
@@ -74,10 +74,10 @@ func Test_usecase_CreateUser(t *testing.T) {
7474
}
7575

7676
t.Run("positive_case_create_user", func(t *testing.T) {
77-
repo.EXPECT().IsUserExist(ctx, newUser.Email).Return(false)
77+
repo.EXPECT().IsUserExist(gomock.Any(), newUser.Email).Return(false)
7878

7979
repo.EXPECT().
80-
SaveNewUser(ctx,
80+
SaveNewUser(gomock.Any(),
8181
createUserMatcher(
8282
entities.User{
8383
Fullname: newUser.FullName,
@@ -94,18 +94,18 @@ func Test_usecase_CreateUser(t *testing.T) {
9494
})
9595

9696
t.Run("negative_email_already_use", func(t *testing.T) {
97-
repo.EXPECT().IsUserExist(ctx, newUser.Email).Return(true)
97+
repo.EXPECT().IsUserExist(gomock.Any(), newUser.Email).Return(true)
9898

9999
userID, err := uc.Create(ctx, newUser)
100100
require.EqualError(t, apperror.ErrEmailAlreadyExist, err.Error())
101101
require.Equal(t, userID, int64(0))
102102
})
103103

104104
t.Run("negative_case_create_user_error_repo", func(t *testing.T) {
105-
repo.EXPECT().IsUserExist(ctx, newUser.Email).Return(false)
105+
repo.EXPECT().IsUserExist(gomock.Any(), newUser.Email).Return(false)
106106

107107
repo.EXPECT().
108-
SaveNewUser(ctx,
108+
SaveNewUser(gomock.Any(),
109109
createUserMatcher(
110110
entities.User{
111111
Fullname: "fullname",
@@ -146,11 +146,11 @@ func Test_usecase_UpdateUserStatus(t *testing.T) {
146146

147147
t.Run("positive_case_UpdateUserStatus", func(t *testing.T) {
148148
repo.EXPECT().
149-
GetUserByID(ctx, args.UserID, gomock.Any()).
149+
GetUserByID(gomock.Any(), args.UserID, gomock.Any()).
150150
Return(entities.User{UserID: 1, IsActive: true}, nil)
151151

152152
repo.EXPECT().
153-
UpdateUserStatusByID(ctx, gomock.Any()).
153+
UpdateUserStatusByID(gomock.Any(), gomock.Any()).
154154
Return(nil)
155155

156156
err := uc.UpdateStatus(ctx, args)
@@ -159,7 +159,7 @@ func Test_usecase_UpdateUserStatus(t *testing.T) {
159159

160160
t.Run("negative_case_UpdateUserStatus_GetUserByID_err", func(t *testing.T) {
161161
repo.EXPECT().
162-
GetUserByID(ctx, args.UserID, gomock.Any()).
162+
GetUserByID(gomock.Any(), args.UserID, gomock.Any()).
163163
Return(entities.User{}, errors.New("something errors"))
164164

165165
err := uc.UpdateStatus(ctx, args)
@@ -168,11 +168,11 @@ func Test_usecase_UpdateUserStatus(t *testing.T) {
168168

169169
t.Run("negative_case_UpdateUserStatus_err", func(t *testing.T) {
170170
repo.EXPECT().
171-
GetUserByID(ctx, args.UserID, gomock.Any()).
171+
GetUserByID(gomock.Any(), args.UserID, gomock.Any()).
172172
Return(entities.User{UserID: 1, IsActive: true}, nil)
173173

174174
repo.EXPECT().
175-
UpdateUserStatusByID(ctx, gomock.Any()).
175+
UpdateUserStatusByID(gomock.Any(), gomock.Any()).
176176
Return(errors.New("there was error"))
177177

178178
err := uc.UpdateStatus(ctx, args)
@@ -208,15 +208,15 @@ func Test_usecase_Detail(t *testing.T) {
208208
}
209209

210210
t.Run("detail_positive", func(t *testing.T) {
211-
repo.EXPECT().GetUserByID(ctx, id).Return(returnedDetail, nil)
211+
repo.EXPECT().GetUserByID(gomock.Any(), id).Return(returnedDetail, nil)
212212

213213
detail, err := uc.Detail(ctx, id)
214214
require.NoError(t, err)
215215
require.Equal(t, detail, entities.NewUserDetail(returnedDetail))
216216
})
217217

218218
t.Run("detail_negative_failed_query_detail", func(t *testing.T) {
219-
repo.EXPECT().GetUserByID(ctx, id).Return(entities.User{}, sql.ErrNoRows)
219+
repo.EXPECT().GetUserByID(gomock.Any(), id).Return(entities.User{}, sql.ErrNoRows)
220220

221221
detail, err := uc.Detail(ctx, id)
222222
require.EqualError(t, err, sql.ErrNoRows.Error())
@@ -251,7 +251,7 @@ func Test_usecase_Login(t *testing.T) {
251251
}
252252

253253
t.Run("login_positive", func(t *testing.T) {
254-
repo.EXPECT().GetUserByEmail(ctx, email).Return(returnedUser, nil)
254+
repo.EXPECT().GetUserByEmail(gomock.Any(), email).Return(returnedUser, nil)
255255

256256
authData, err := uc.Login(ctx, dtos.UserLoginRequest{Email: email, Password: password})
257257
require.NoError(t, err)
@@ -260,7 +260,7 @@ func Test_usecase_Login(t *testing.T) {
260260
})
261261

262262
t.Run("login_negative_invalid_password", func(t *testing.T) {
263-
repo.EXPECT().GetUserByEmail(ctx, email).Return(returnedUser, nil)
263+
repo.EXPECT().GetUserByEmail(gomock.Any(), email).Return(returnedUser, nil)
264264

265265
authData, err := uc.Login(ctx, dtos.UserLoginRequest{Email: email, Password: "testingpwd"})
266266
require.EqualError(t, apperror.ErrInvalidPassword, err.Error())
@@ -269,7 +269,7 @@ func Test_usecase_Login(t *testing.T) {
269269
})
270270

271271
t.Run("login_negative_failed_query_email", func(t *testing.T) {
272-
repo.EXPECT().GetUserByEmail(ctx, email).Return(entities.User{}, sql.ErrNoRows)
272+
repo.EXPECT().GetUserByEmail(gomock.Any(), email).Return(entities.User{}, sql.ErrNoRows)
273273

274274
authData, err := uc.Login(ctx, dtos.UserLoginRequest{Email: email, Password: password})
275275
require.EqualError(t, err, sql.ErrNoRows.Error())

0 commit comments

Comments
 (0)