From d8541f73861ed3e4c5fabf6110c76c7efd748ad1 Mon Sep 17 00:00:00 2001 From: Sergey Chubaryan Date: Tue, 3 Sep 2024 17:42:38 +0300 Subject: [PATCH] better loggings for shortlinks --- load_tests/api.py | 13 +++++++++- load_tests/tests/shortlink.py | 13 ++++++++++ src/app.go | 2 +- src/core/services/shortlink_service.go | 10 +++++++- src/server/handlers/shortlink_handlers.go | 28 ++++++++++++++++++---- src/server/handlers/user_create_handler.go | 2 +- src/server/server.go | 4 ++-- 7 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 load_tests/tests/shortlink.py diff --git a/load_tests/api.py b/load_tests/api.py index 3d1956e..d41fc4c 100644 --- a/load_tests/api.py +++ b/load_tests/api.py @@ -70,4 +70,15 @@ class BackendApi(): def health_get(self): response = self.http.client.get("/health") if response.status_code != 200: - raise AssertionError('something wrong') \ No newline at end of file + raise AssertionError('something wrong') + + def shortlink_create(self, url: string) -> string: + response = self.http.client.post("/s/new?url=" + url) + if response.status_code != 200: + raise AssertionError('can not login user') + + link = response.json()['link'] + if link == '': + raise AssertionError('empty user token') + + return link \ No newline at end of file diff --git a/load_tests/tests/shortlink.py b/load_tests/tests/shortlink.py new file mode 100644 index 0000000..2f9072c --- /dev/null +++ b/load_tests/tests/shortlink.py @@ -0,0 +1,13 @@ +from locust import FastHttpUser, task + +from api import BackendApi + +class ShortlinkCreate(FastHttpUser): + api: BackendApi + + @task + def user_create_test(self): + self.api.shortlink_create("https://ya.ru") + + def on_start(self): + self.api = BackendApi(self) \ No newline at end of file diff --git a/src/app.go b/src/app.go index 8831ec4..a3cfe43 100644 --- a/src/app.go +++ b/src/app.go @@ -114,7 +114,7 @@ func (a *App) Run(p RunParams) { } tracerProvider := traceSdk.NewTracerProvider( - traceSdk.WithSampler(traceSdk.AlwaysSample()), + traceSdk.WithSampler(traceSdk.TraceIDRatioBased(0.1)), traceSdk.WithBatcher( tracerExporter, traceSdk.WithMaxQueueSize(8192), diff --git a/src/core/services/shortlink_service.go b/src/core/services/shortlink_service.go index d5fb73e..6d83829 100644 --- a/src/core/services/shortlink_service.go +++ b/src/core/services/shortlink_service.go @@ -10,6 +10,11 @@ import ( "time" ) +var ( + ErrShortlinkNotexist = fmt.Errorf("shortlink does not exist or expired") + ErrShortlinkExpired = fmt.Errorf("shortlink expired") +) + type ShortlinkService interface { CreateShortlink(ctx context.Context, url string) (string, error) GetShortlink(ctx context.Context, id string) (string, error) @@ -66,7 +71,10 @@ func (s *shortlinkService) GetShortlink(ctx context.Context, id string) (string, return "", err } if link == nil { - return "", fmt.Errorf("link does not exist or expired") + return "", ErrShortlinkNotexist + } + if time.Now().After(link.Expiration) { + return "", ErrShortlinkExpired } return link.Url, nil diff --git a/src/server/handlers/shortlink_handlers.go b/src/server/handlers/shortlink_handlers.go index 1f417ac..d587952 100644 --- a/src/server/handlers/shortlink_handlers.go +++ b/src/server/handlers/shortlink_handlers.go @@ -2,6 +2,7 @@ package handlers import ( "backend/src/core/services" + "backend/src/logger" "encoding/json" "fmt" "net/url" @@ -13,23 +14,28 @@ type shortlinkCreateOutput struct { Link string `json:"link"` } -func NewShortlinkCreateHandler(shortlinkService services.ShortlinkService) gin.HandlerFunc { +func NewShortlinkCreateHandler(logger logger.Logger, shortlinkService services.ShortlinkService) gin.HandlerFunc { return func(ctx *gin.Context) { + ctxLogger := logger.WithContext(ctx) + rawUrl := ctx.Query("url") if rawUrl == "" { - ctx.AbortWithError(400, fmt.Errorf("no url param")) + ctxLogger.Error().Msg("url query param missing") + ctx.AbortWithError(400, fmt.Errorf("url query param missing")) return } u, err := url.Parse(rawUrl) if err != nil { - ctx.Data(500, "plain/text", []byte(err.Error())) + ctxLogger.Error().Err(err).Msg("error parsing url param") + ctx.Data(400, "plain/text", []byte(err.Error())) return } u.Scheme = "https" linkId, err := shortlinkService.CreateShortlink(ctx, u.String()) if err != nil { + ctxLogger.Error().Err(err).Msg("err creating shortlink") ctx.Data(500, "plain/text", []byte(err.Error())) return } @@ -38,6 +44,7 @@ func NewShortlinkCreateHandler(shortlinkService services.ShortlinkService) gin.H Link: "https://nucrea.ru/s/" + linkId, }) if err != nil { + ctxLogger.Error().Err(err).Msg("err marshalling shortlink") ctx.AbortWithError(500, err) return } @@ -46,12 +53,25 @@ func NewShortlinkCreateHandler(shortlinkService services.ShortlinkService) gin.H } } -func NewShortlinkResolveHandler(shortlinkService services.ShortlinkService) gin.HandlerFunc { +func NewShortlinkResolveHandler(logger logger.Logger, shortlinkService services.ShortlinkService) gin.HandlerFunc { return func(ctx *gin.Context) { + ctxLogger := logger.WithContext(ctx) + linkId := ctx.Param("linkId") linkUrl, err := shortlinkService.GetShortlink(ctx, linkId) + if err == services.ErrShortlinkNotexist { + ctxLogger.Error().Err(err).Msg("err getting shortlink") + ctx.AbortWithError(404, err) + return + } + if err == services.ErrShortlinkExpired { + ctxLogger.Error().Err(err).Msg("err getting shortlink") + ctx.AbortWithError(404, err) + return + } if err != nil { + ctxLogger.Error().Err(err).Msg("unexpected err getting shortlink") ctx.AbortWithError(500, err) return } diff --git a/src/server/handlers/user_create_handler.go b/src/server/handlers/user_create_handler.go index 98f3e34..94ebf67 100644 --- a/src/server/handlers/user_create_handler.go +++ b/src/server/handlers/user_create_handler.go @@ -50,7 +50,7 @@ func NewUserCreateHandler(logger logger.Logger, userService services.UserService return } if err != nil { - ctxLogger.Error().Err(err).Msg("create user error") + ctxLogger.Error().Err(err).Msg("unexpected create user error") c.Data(500, "plain/text", []byte(err.Error())) return } diff --git a/src/server/server.go b/src/server/server.go index 6d65309..b266cdd 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -50,8 +50,8 @@ func New(opts NewServerOpts) *Server { r.GET("/pooling", handlers.NewLongPoolingHandler(opts.Logger, opts.Notifier)) linkGroup := r.Group("/s") - linkGroup.POST("/new", handlers.NewShortlinkCreateHandler(opts.ShortlinkService)) - linkGroup.GET("/:linkId", handlers.NewShortlinkResolveHandler(opts.ShortlinkService)) + linkGroup.POST("/new", handlers.NewShortlinkCreateHandler(opts.Logger, opts.ShortlinkService)) + linkGroup.GET("/:linkId", handlers.NewShortlinkResolveHandler(opts.Logger, opts.ShortlinkService)) userGroup := r.Group("/user") userGroup.POST("/create", handlers.NewUserCreateHandler(opts.Logger, opts.UserService))