From fa28f1ff824feb6635f44f49acf99d84bb5f6be6 Mon Sep 17 00:00:00 2001 From: Roman Loginov Date: Sun, 27 Aug 2023 18:09:02 +0300 Subject: [PATCH] [#36] Move log messages to constants Signed-off-by: Roman Loginov --- app.go | 59 ++++++++++++++++---------------- downloader/download.go | 39 ++++++++++----------- downloader/head.go | 3 +- internal/logs/logs.go | 69 ++++++++++++++++++++++++++++++++++++++ metrics/service.go | 11 +++--- settings.go | 15 +++++---- uploader/filter.go | 3 +- uploader/multipart.go | 5 +-- uploader/multipart_test.go | 5 +-- uploader/upload.go | 17 +++++----- 10 files changed, 152 insertions(+), 74 deletions(-) create mode 100644 internal/logs/logs.go diff --git a/app.go b/app.go index 88f9a07..864f39c 100644 --- a/app.go +++ b/app.go @@ -12,6 +12,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-http-gw/downloader" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/frostfs/services" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/metrics" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/resolver" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/response" @@ -148,7 +149,7 @@ func (a *app) initResolver() { var err error a.resolver, err = resolver.NewContainerResolver(a.getResolverConfig()) if err != nil { - a.log.Fatal("failed to create resolver", zap.Error(err)) + a.log.Fatal(logs.FailedToCreateResolver, zap.Error(err)) } } @@ -161,11 +162,11 @@ func (a *app) getResolverConfig() ([]string, *resolver.Config) { order := a.cfg.GetStringSlice(cfgResolveOrder) if resolveCfg.RPCAddress == "" { order = remove(order, resolver.NNSResolver) - a.log.Warn(fmt.Sprintf("resolver '%s' won't be used since '%s' isn't provided", resolver.NNSResolver, cfgRPCEndpoint)) + a.log.Warn(logs.ResolverNNSWontBeUsedSinceRPCEndpointIsntProvided) } if len(order) == 0 { - a.log.Info("container resolver will be disabled because of resolvers 'resolver_order' is empty") + a.log.Info(logs.ContainerResolverWillBeDisabledBecauseOfResolversResolverOrderIsEmpty) } return order, resolveCfg @@ -179,7 +180,7 @@ func (a *app) initMetrics() { func newGateMetrics(logger *zap.Logger, provider *metrics.GateMetrics, enabled bool) *gateMetrics { if !enabled { - logger.Warn("metrics are disabled") + logger.Warn(logs.MetricsAreDisabled) } return &gateMetrics{ logger: logger, @@ -190,7 +191,7 @@ func newGateMetrics(logger *zap.Logger, provider *metrics.GateMetrics, enabled b func (m *gateMetrics) SetEnabled(enabled bool) { if !enabled { - m.logger.Warn("metrics are disabled") + m.logger.Warn(logs.MetricsAreDisabled) } m.mu.Lock() @@ -243,7 +244,7 @@ func getFrostFSKey(cfg *viper.Viper, log *zap.Logger) (*keys.PrivateKey, error) walletPath := cfg.GetString(cfgWalletPath) if len(walletPath) == 0 { - log.Info("no wallet path specified, creating ephemeral key automatically for this run") + log.Info(logs.NoWalletPathSpecifiedCreatingEphemeralKeyAutomaticallyForThisRun) key, err := keys.NewPrivateKey() if err != nil { return nil, err @@ -300,7 +301,7 @@ func getKeyFromWallet(w *wallet.Wallet, addrStr string, password *string) (*keys } func (a *app) Wait() { - a.log.Info("starting application", zap.String("app_name", "frostfs-http-gw"), zap.String("version", Version)) + a.log.Info(logs.StartingApplication, zap.String("app_name", "frostfs-http-gw"), zap.String("version", Version)) a.metrics.SetVersion(Version) a.setHealthStatus() @@ -324,9 +325,9 @@ func (a *app) Serve() { for i := range a.servers { go func(i int) { - a.log.Info("starting server", zap.String("address", a.servers[i].Address())) + a.log.Info(logs.StartingServer, zap.String("address", a.servers[i].Address())) if err := a.webServer.Serve(a.servers[i].Listener()); err != nil && err != http.ErrServerClosed { - a.log.Fatal("listen and serve", zap.Error(err)) + a.log.Fatal(logs.ListenAndServe, zap.Error(err)) } }(i) } @@ -344,7 +345,7 @@ LOOP: } } - a.log.Info("shutting down web server", zap.Error(a.webServer.Shutdown())) + a.log.Info(logs.ShuttingDownWebServer, zap.Error(a.webServer.Shutdown())) a.metrics.Shutdown() a.stopServices() @@ -359,33 +360,33 @@ func (a *app) shutdownTracing() { defer cancel() if err := tracing.Shutdown(shdnCtx); err != nil { - a.log.Warn("failed to shutdown tracing", zap.Error(err)) + a.log.Warn(logs.FailedToShutdownTracing, zap.Error(err)) } } func (a *app) configReload(ctx context.Context) { - a.log.Info("SIGHUP config reload started") + a.log.Info(logs.SIGHUPConfigReloadStarted) if !a.cfg.IsSet(cmdConfig) && !a.cfg.IsSet(cmdConfigDir) { - a.log.Warn("failed to reload config because it's missed") + a.log.Warn(logs.FailedToReloadConfigBecauseItsMissed) return } if err := readInConfig(a.cfg); err != nil { - a.log.Warn("failed to reload config", zap.Error(err)) + a.log.Warn(logs.FailedToReloadConfig, zap.Error(err)) return } if lvl, err := getLogLevel(a.cfg); err != nil { - a.log.Warn("log level won't be updated", zap.Error(err)) + a.log.Warn(logs.LogLevelWontBeUpdated, zap.Error(err)) } else { a.logLevel.SetLevel(lvl) } if err := a.resolver.UpdateResolvers(a.getResolverConfig()); err != nil { - a.log.Warn("failed to update resolvers", zap.Error(err)) + a.log.Warn(logs.FailedToUpdateResolvers, zap.Error(err)) } if err := a.updateServers(); err != nil { - a.log.Warn("failed to reload server parameters", zap.Error(err)) + a.log.Warn(logs.FailedToReloadServerParameters, zap.Error(err)) } a.stopServices() @@ -397,7 +398,7 @@ func (a *app) configReload(ctx context.Context) { a.initTracing(ctx) a.setHealthStatus() - a.log.Info("SIGHUP config reload completed") + a.log.Info(logs.SIGHUPConfigReloadCompleted) } func (a *app) updateSettings() { @@ -436,22 +437,22 @@ func (a *app) configureRouter(uploadRoutes *uploader.Uploader, downloadRoutes *d response.Error(r, "Method Not Allowed", fasthttp.StatusMethodNotAllowed) } r.POST("/upload/{cid}", a.logger(a.tokenizer(a.tracer(uploadRoutes.Upload)))) - a.log.Info("added path /upload/{cid}") + a.log.Info(logs.AddedPathUploadCid) r.GET("/get/{cid}/{oid:*}", a.logger(a.tokenizer(a.tracer(downloadRoutes.DownloadByAddressOrBucketName)))) r.HEAD("/get/{cid}/{oid:*}", a.logger(a.tokenizer(a.tracer(downloadRoutes.HeadByAddressOrBucketName)))) - a.log.Info("added path /get/{cid}/{oid}") + a.log.Info(logs.AddedPathGetCidOid) r.GET("/get_by_attribute/{cid}/{attr_key}/{attr_val:*}", a.logger(a.tokenizer(a.tracer(downloadRoutes.DownloadByAttribute)))) r.HEAD("/get_by_attribute/{cid}/{attr_key}/{attr_val:*}", a.logger(a.tokenizer(a.tracer(downloadRoutes.HeadByAttribute)))) - a.log.Info("added path /get_by_attribute/{cid}/{attr_key}/{attr_val:*}") + a.log.Info(logs.AddedPathGetByAttributeCidAttrKeyAttrVal) r.GET("/zip/{cid}/{prefix:*}", a.logger(a.tokenizer(a.tracer(downloadRoutes.DownloadZipped)))) - a.log.Info("added path /zip/{cid}/{prefix}") + a.log.Info(logs.AddedPathZipCidPrefix) a.webServer.Handler = r.Handler } func (a *app) logger(h fasthttp.RequestHandler) fasthttp.RequestHandler { return func(req *fasthttp.RequestCtx) { - a.log.Info("request", zap.String("remote", req.RemoteAddr().String()), + a.log.Info(logs.Request, zap.String("remote", req.RemoteAddr().String()), zap.ByteString("method", req.Method()), zap.ByteString("path", req.Path()), zap.ByteString("query", req.QueryArgs().QueryString()), @@ -464,7 +465,7 @@ func (a *app) tokenizer(h fasthttp.RequestHandler) fasthttp.RequestHandler { return func(req *fasthttp.RequestCtx) { appCtx, err := tokens.StoreBearerTokenAppCtx(a.ctx, req) if err != nil { - a.log.Error("could not fetch and store bearer token", zap.Error(err)) + a.log.Error(logs.CouldNotFetchAndStoreBearerToken, zap.Error(err)) response.Error(req, "could not fetch and store bearer token: "+err.Error(), fasthttp.StatusBadRequest) } utils.SetContextToRequest(appCtx, req) @@ -507,16 +508,16 @@ func (a *app) initServers(ctx context.Context) { } srv, err := newServer(ctx, serverInfo) if err != nil { - a.log.Warn("failed to add server", append(fields, zap.Error(err))...) + a.log.Warn(logs.FailedToAddServer, append(fields, zap.Error(err))...) continue } a.servers = append(a.servers, srv) - a.log.Info("add server", fields...) + a.log.Info(logs.AddServer, fields...) } if len(a.servers) == 0 { - a.log.Fatal("no healthy servers") + a.log.Fatal(logs.NoHealthyServers) } } @@ -569,9 +570,9 @@ func (a *app) initTracing(ctx context.Context) { } updated, err := tracing.Setup(ctx, cfg) if err != nil { - a.log.Warn("failed to initialize tracing", zap.Error(err)) + a.log.Warn(logs.FailedToInitializeTracing, zap.Error(err)) } if updated { - a.log.Info("tracing config updated") + a.log.Info(logs.TracingConfigUpdated) } } diff --git a/downloader/download.go b/downloader/download.go index 2a08c82..cd7f72f 100644 --- a/downloader/download.go +++ b/downloader/download.go @@ -15,6 +15,7 @@ import ( "strings" "time" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/resolver" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/response" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/tokens" @@ -134,7 +135,7 @@ func receiveFile(ctx context.Context, req request, clnt *pool.Pool, objectAddres case object.AttributeTimestamp: value, err := strconv.ParseInt(val, 10, 64) if err != nil { - req.log.Info("couldn't parse creation date", + req.log.Info(logs.CouldntParseCreationDate, zap.String("key", key), zap.String("val", val), zap.Error(err)) @@ -157,7 +158,7 @@ func receiveFile(ctx context.Context, req request, clnt *pool.Pool, objectAddres return rObj.Payload, nil }) if err != nil && err != io.EOF { - req.log.Error("could not detect Content-Type from payload", zap.Error(err)) + req.log.Error(logs.CouldNotDetectContentTypeFromPayload, zap.Error(err)) response.Error(req.RequestCtx, "could not detect Content-Type from payload: "+err.Error(), fasthttp.StatusBadRequest) return } @@ -195,7 +196,7 @@ func (r *request) handleFrostFSErr(err error, start time.Time) { statusCode, msg, additionalFields := response.FormErrorResponse("could not receive object", err) logFields = append(logFields, additionalFields...) - r.log.Error("could not receive object", logFields...) + r.log.Error(logs.CouldNotReceiveObject, logFields...) response.Error(r.RequestCtx, msg, statusCode) } @@ -264,14 +265,14 @@ func (d *Downloader) byAddress(c *fasthttp.RequestCtx, f func(context.Context, r cnrID, err := utils.GetContainerID(ctx, idCnr, d.containerResolver) if err != nil { - log.Error("wrong container id", zap.Error(err)) + log.Error(logs.WrongContainerID, zap.Error(err)) response.Error(c, "wrong container id", fasthttp.StatusBadRequest) return } objID := new(oid.ID) if err = objID.DecodeString(idObj); err != nil { - log.Error("wrong object id", zap.Error(err)) + log.Error(logs.WrongObjectID, zap.Error(err)) response.Error(c, "wrong object id", fasthttp.StatusBadRequest) return } @@ -296,19 +297,19 @@ func (d *Downloader) byBucketname(req *fasthttp.RequestCtx, f func(context.Conte cnrID, err := utils.GetContainerID(ctx, bucketname, d.containerResolver) if err != nil { - log.Error("wrong container id", zap.Error(err)) + log.Error(logs.WrongContainerID, zap.Error(err)) response.Error(req, "wrong container id", fasthttp.StatusBadRequest) return } foundOid, err := d.tree.GetLatestVersion(ctx, cnrID, key) if err != nil { - log.Error("object wasn't found", zap.Error(err)) + log.Error(logs.ObjectWasntFound, zap.Error(err)) response.Error(req, "object wasn't found", fasthttp.StatusNotFound) return } if foundOid.DeleteMarker { - log.Error("object was deleted") + log.Error(logs.ObjectWasDeleted) response.Error(req, "object deleted", fasthttp.StatusNotFound) return } @@ -338,14 +339,14 @@ func (d *Downloader) byAttribute(c *fasthttp.RequestCtx, f func(context.Context, containerID, err := utils.GetContainerID(ctx, scid, d.containerResolver) if err != nil { - log.Error("wrong container id", zap.Error(err)) + log.Error(logs.WrongContainerID, zap.Error(err)) response.Error(c, "wrong container id", fasthttp.StatusBadRequest) return } res, err := d.search(ctx, containerID, key, val, object.MatchStringEqual) if err != nil { - log.Error("could not search for objects", zap.Error(err)) + log.Error(logs.CouldNotSearchForObjects, zap.Error(err)) response.Error(c, "could not search for objects: "+err.Error(), fasthttp.StatusBadRequest) return } @@ -357,12 +358,12 @@ func (d *Downloader) byAttribute(c *fasthttp.RequestCtx, f func(context.Context, n, err := res.Read(buf) if n == 0 { if errors.Is(err, io.EOF) { - log.Error("object not found", zap.Error(err)) + log.Error(logs.ObjectNotFound, zap.Error(err)) response.Error(c, "object not found", fasthttp.StatusNotFound) return } - log.Error("read object list failed", zap.Error(err)) + log.Error(logs.ReadObjectListFailed, zap.Error(err)) response.Error(c, "read object list failed: "+err.Error(), fasthttp.StatusBadRequest) return } @@ -424,7 +425,7 @@ func (d *Downloader) DownloadZipped(c *fasthttp.RequestCtx) { containerID, err := utils.GetContainerID(ctx, scid, d.containerResolver) if err != nil { - log.Error("wrong container id", zap.Error(err)) + log.Error(logs.WrongContainerID, zap.Error(err)) response.Error(c, "wrong container id", fasthttp.StatusBadRequest) return } @@ -433,7 +434,7 @@ func (d *Downloader) DownloadZipped(c *fasthttp.RequestCtx) { // otherwise we get this error only in object iteration step // and client get 200 OK. if _, err = d.getContainer(ctx, *containerID); err != nil { - log.Error("could not check container existence", zap.Error(err)) + log.Error(logs.CouldNotCheckContainerExistence, zap.Error(err)) if client.IsErrContainerNotFound(err) { response.Error(c, "Not Found", fasthttp.StatusNotFound) return @@ -444,7 +445,7 @@ func (d *Downloader) DownloadZipped(c *fasthttp.RequestCtx) { resSearch, err := d.search(ctx, containerID, object.AttributeFilePath, prefix, object.MatchCommonPrefix) if err != nil { - log.Error("could not search for objects", zap.Error(err)) + log.Error(logs.CouldNotSearchForObjects, zap.Error(err)) response.Error(c, "could not search for objects: "+err.Error(), fasthttp.StatusBadRequest) return } @@ -476,19 +477,19 @@ func (d *Downloader) DownloadZipped(c *fasthttp.RequestCtx) { addr.SetObject(id) if err = d.zipObject(ctx, zipWriter, addr, btoken, bufZip); err != nil { - log.Error("failed to add object to archive", zap.String("oid", id.EncodeToString()), zap.Error(err)) + log.Error(logs.FailedToAddObjectToArchive, zap.String("oid", id.EncodeToString()), zap.Error(err)) } return false }) if errIter != nil { - log.Error("iterating over selected objects failed", zap.Error(errIter)) + log.Error(logs.IteratingOverSelectedObjectsFailed, zap.Error(errIter)) } else if !called { - log.Error("objects not found") + log.Error(logs.ObjectsNotFound) } if err = zipWriter.Close(); err != nil { - log.Error("close zip writer", zap.Error(err)) + log.Error(logs.CloseZipWriter, zap.Error(err)) } }) } diff --git a/downloader/head.go b/downloader/head.go index 3e5a92a..76dfd93 100644 --- a/downloader/head.go +++ b/downloader/head.go @@ -7,6 +7,7 @@ import ( "strconv" "time" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/utils" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" @@ -57,7 +58,7 @@ func headObject(ctx context.Context, req request, clnt *pool.Pool, objectAddress case object.AttributeTimestamp: value, err := strconv.ParseInt(val, 10, 64) if err != nil { - req.log.Info("couldn't parse creation date", + req.log.Info(logs.CouldntParseCreationDate, zap.String("key", key), zap.String("val", val), zap.Error(err)) diff --git a/internal/logs/logs.go b/internal/logs/logs.go new file mode 100644 index 0000000..d47a2c3 --- /dev/null +++ b/internal/logs/logs.go @@ -0,0 +1,69 @@ +package logs + +const ( + CouldntParseCreationDate = "couldn't parse creation date" // Info in ../../downloader/* + CouldNotDetectContentTypeFromPayload = "could not detect Content-Type from payload" // Error in ../../downloader/download.go + CouldNotReceiveObject = "could not receive object" // Error in ../../downloader/download.go + WrongContainerID = "wrong container id" // Error in ../../downloader/download.go and uploader/upload.go + WrongObjectID = "wrong object id" // Error in ../../downloader/download.go + ObjectWasntFound = "object wasn't found" // Error in ../../downloader/download.go + ObjectWasDeleted = "object was deleted" // Error in ../../downloader/download.go + CouldNotSearchForObjects = "could not search for objects" // Error in ../../downloader/download.go + ObjectNotFound = "object not found" // Error in ../../downloader/download.go + ReadObjectListFailed = "read object list failed" // Error in ../../downloader/download.go + CouldNotCheckContainerExistence = "could not check container existence" // Error in ../../downloader/download.go + FailedToAddObjectToArchive = "failed to add object to archive" // Error in ../../downloader/download.go + IteratingOverSelectedObjectsFailed = "iterating over selected objects failed" // Error in ../../downloader/download.go + ObjectsNotFound = "objects not found" // Error in ../../downloader/download.go + CloseZipWriter = "close zip writer" // Error in ../../downloader/download.go + ServiceIsRunning = "service is running" // Info in ../../metrics/service.go + ServiceCouldntStartOnConfiguredPort = "service couldn't start on configured port" // Warn in ../../metrics/service.go + ServiceHasntStartedSinceItsDisabled = "service hasn't started since it's disabled" // Info in ../../metrics/service.go + ShuttingDownService = "shutting down service" // Info in ../../metrics/service.go + CantShutDownService = "can't shut down service" // Panic in ../../metrics/service.go + IgnorePartEmptyFormName = "ignore part, empty form name" // Debug in ../../uploader/upload.go + IgnorePartEmptyFilename = "ignore part, empty filename" // Debug in ../../uploader/upload.go + CloseTemporaryMultipartFormFile = "close temporary multipart/form file" // Debug in ../../uploader/upload.go + CouldNotReceiveMultipartForm = "could not receive multipart/form" // Error in ../../uploader/upload.go + CouldNotProcessHeaders = "could not process headers" // Error in ../../uploader/upload.go + CouldNotParseClientTime = "could not parse client time" // Warn in ../../uploader/upload.go + CouldNotPrepareExpirationHeader = "could not prepare expiration header" // Error in ../../uploader/upload.go + CouldNotEncodeResponse = "could not encode response" // Error in ../../uploader/upload.go + CouldNotStoreFileInFrostfs = "could not store file in frostfs" // Error in ../../uploader/upload.go + AddAttributeToResultObject = "add attribute to result object" // Debug in ../../uploader/filter.go + FailedToCreateResolver = "failed to create resolver" // Fatal in ../../app.go + ContainerResolverWillBeDisabledBecauseOfResolversResolverOrderIsEmpty = "container resolver will be disabled because of resolvers 'resolver_order' is empty" // Info in ../../app.go + MetricsAreDisabled = "metrics are disabled" // Warn in ../../app.go + NoWalletPathSpecifiedCreatingEphemeralKeyAutomaticallyForThisRun = "no wallet path specified, creating ephemeral key automatically for this run" // Info in ../../app.go + StartingApplication = "starting application" // Info in ../../app.go + StartingServer = "starting server" // Info in ../../app.go + ListenAndServe = "listen and serve" // Fatal in ../../app.go + ShuttingDownWebServer = "shutting down web server" // Info in ../../app.go + FailedToShutdownTracing = "failed to shutdown tracing" // Warn in ../../app.go + SIGHUPConfigReloadStarted = "SIGHUP config reload started" // Info in ../../app.go + FailedToReloadConfigBecauseItsMissed = "failed to reload config because it's missed" // Warn in ../../app.go + FailedToReloadConfig = "failed to reload config" // Warn in ../../app.go + LogLevelWontBeUpdated = "log level won't be updated" // Warn in ../../app.go + FailedToUpdateResolvers = "failed to update resolvers" // Warn in ../../app.go + FailedToReloadServerParameters = "failed to reload server parameters" // Warn in ../../app.go + SIGHUPConfigReloadCompleted = "SIGHUP config reload completed" // Info in ../../app.go + AddedPathUploadCid = "added path /upload/{cid}" // Info in ../../app.go + AddedPathGetCidOid = "added path /get/{cid}/{oid}" // Info in ../../app.go + AddedPathGetByAttributeCidAttrKeyAttrVal = "added path /get_by_attribute/{cid}/{attr_key}/{attr_val:*}" // Info in ../../app.go + AddedPathZipCidPrefix = "added path /zip/{cid}/{prefix}" // Info in ../../app.go + Request = "request" // Info in ../../app.go + CouldNotFetchAndStoreBearerToken = "could not fetch and store bearer token" // Error in ../../app.go + FailedToAddServer = "failed to add server" // Warn in ../../app.go + AddServer = "add server" // Info in ../../app.go + NoHealthyServers = "no healthy servers" // Fatal in ../../app.go + FailedToInitializeTracing = "failed to initialize tracing" // Warn in ../../app.go + TracingConfigUpdated = "tracing config updated" // Info in ../../app.go + ResolverNNSWontBeUsedSinceRPCEndpointIsntProvided = "resolver nns won't be used since rpc_endpoint isn't provided" // Warn in ../../app.go + CouldNotLoadFrostFSPrivateKey = "could not load FrostFS private key" // Fatal in ../../settings.go + UsingCredentials = "using credentials" // Info in ../../settings.go + FailedToCreateConnectionPool = "failed to create connection pool" // Fatal in ../../settings.go + FailedToDialConnectionPool = "failed to dial connection pool" // Fatal in ../../settings.go + FailedToCreateTreePool = "failed to create tree pool" // Fatal in ../../settings.go + FailedToDialTreePool = "failed to dial tree pool" // Fatal in ../../settings.go + AddedStoragePeer = "added storage peer" // Info in ../../settings.go +) diff --git a/metrics/service.go b/metrics/service.go index 7cb3ca2..c025f06 100644 --- a/metrics/service.go +++ b/metrics/service.go @@ -4,6 +4,7 @@ import ( "context" "net/http" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "go.uber.org/zap" ) @@ -24,21 +25,21 @@ type Config struct { // Start runs http service with the exposed endpoint on the configured port. func (ms *Service) Start() { if ms.enabled { - ms.log.Info("service is running", zap.String("endpoint", ms.Addr)) + ms.log.Info(logs.ServiceIsRunning, zap.String("endpoint", ms.Addr)) err := ms.ListenAndServe() if err != nil && err != http.ErrServerClosed { - ms.log.Warn("service couldn't start on configured port") + ms.log.Warn(logs.ServiceCouldntStartOnConfiguredPort) } } else { - ms.log.Info("service hasn't started since it's disabled") + ms.log.Info(logs.ServiceHasntStartedSinceItsDisabled) } } // ShutDown stops the service. func (ms *Service) ShutDown(ctx context.Context) { - ms.log.Info("shutting down service", zap.String("endpoint", ms.Addr)) + ms.log.Info(logs.ShuttingDownService, zap.String("endpoint", ms.Addr)) err := ms.Shutdown(ctx) if err != nil { - ms.log.Panic("can't shut down service") + ms.log.Panic(logs.CantShutDownService) } } diff --git a/settings.go b/settings.go index c402335..ed13da2 100644 --- a/settings.go +++ b/settings.go @@ -12,6 +12,7 @@ import ( "strings" "time" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/resolver" grpctracing "git.frostfs.info/TrueCloudLab/frostfs-observability/tracing/grpc" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/pool" @@ -403,7 +404,7 @@ func fetchServers(v *viper.Viper) []ServerInfo { func getPools(ctx context.Context, logger *zap.Logger, cfg *viper.Viper) (*pool.Pool, *treepool.Pool, *keys.PrivateKey) { key, err := getFrostFSKey(cfg, logger) if err != nil { - logger.Fatal("could not load FrostFS private key", zap.Error(err)) + logger.Fatal(logs.CouldNotLoadFrostFSPrivateKey, zap.Error(err)) } var prm pool.InitParameters @@ -411,7 +412,7 @@ func getPools(ctx context.Context, logger *zap.Logger, cfg *viper.Viper) (*pool. prm.SetKey(&key.PrivateKey) prmTree.SetKey(key) - logger.Info("using credentials", zap.String("FrostFS", hex.EncodeToString(key.PublicKey().Bytes()))) + logger.Info(logs.UsingCredentials, zap.String("FrostFS", hex.EncodeToString(key.PublicKey().Bytes()))) for _, peer := range fetchPeers(logger, cfg) { prm.AddNode(peer) @@ -469,19 +470,19 @@ func getPools(ctx context.Context, logger *zap.Logger, cfg *viper.Viper) (*pool. p, err := pool.NewPool(prm) if err != nil { - logger.Fatal("failed to create connection pool", zap.Error(err)) + logger.Fatal(logs.FailedToCreateConnectionPool, zap.Error(err)) } if err = p.Dial(ctx); err != nil { - logger.Fatal("failed to dial connection pool", zap.Error(err)) + logger.Fatal(logs.FailedToDialConnectionPool, zap.Error(err)) } treePool, err := treepool.NewPool(prmTree) if err != nil { - logger.Fatal("failed to create tree pool", zap.Error(err)) + logger.Fatal(logs.FailedToCreateTreePool, zap.Error(err)) } if err = treePool.Dial(ctx); err != nil { - logger.Fatal("failed to dial tree pool", zap.Error(err)) + logger.Fatal(logs.FailedToDialTreePool, zap.Error(err)) } return p, treePool, key @@ -507,7 +508,7 @@ func fetchPeers(l *zap.Logger, v *viper.Viper) []pool.NodeParam { nodes = append(nodes, pool.NewNodeParam(priority, address, weight)) - l.Info("added storage peer", + l.Info(logs.AddedStoragePeer, zap.Int("priority", priority), zap.String("address", address), zap.Float64("weight", weight)) diff --git a/uploader/filter.go b/uploader/filter.go index 35de625..70d6eef 100644 --- a/uploader/filter.go +++ b/uploader/filter.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/utils" "github.com/valyala/fasthttp" "go.uber.org/zap" @@ -47,7 +48,7 @@ func filterHeaders(l *zap.Logger, header *fasthttp.RequestHeader) (map[string]st result[k] = v - l.Debug("add attribute to result object", + l.Debug(logs.AddAttributeToResultObject, zap.String("key", k), zap.String("val", v)) }) diff --git a/uploader/multipart.go b/uploader/multipart.go index cda4b34..135ee88 100644 --- a/uploader/multipart.go +++ b/uploader/multipart.go @@ -3,6 +3,7 @@ package uploader import ( "io" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/uploader/multipart" "go.uber.org/zap" ) @@ -28,7 +29,7 @@ func fetchMultipartFile(l *zap.Logger, r io.Reader, boundary string) (MultipartF name := part.FormName() if name == "" { - l.Debug("ignore part, empty form name") + l.Debug(logs.IgnorePartEmptyFormName) continue } @@ -36,7 +37,7 @@ func fetchMultipartFile(l *zap.Logger, r io.Reader, boundary string) (MultipartF // ignore multipart/form-data values if filename == "" { - l.Debug("ignore part, empty filename", zap.String("form", name)) + l.Debug(logs.IgnorePartEmptyFilename, zap.String("form", name)) continue } diff --git a/uploader/multipart_test.go b/uploader/multipart_test.go index aad2b66..d19cd5e 100644 --- a/uploader/multipart_test.go +++ b/uploader/multipart_test.go @@ -10,6 +10,7 @@ import ( "os" "testing" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -111,7 +112,7 @@ func fetchMultipartFileDefault(l *zap.Logger, r io.Reader, boundary string) (Mul name := part.FormName() if name == "" { - l.Debug("ignore part, empty form name") + l.Debug(logs.IgnorePartEmptyFormName) continue } @@ -119,7 +120,7 @@ func fetchMultipartFileDefault(l *zap.Logger, r io.Reader, boundary string) (Mul // ignore multipart/form-data values if filename == "" { - l.Debug("ignore part, empty filename", zap.String("form", name)) + l.Debug(logs.IgnorePartEmptyFilename, zap.String("form", name)) continue } diff --git a/uploader/upload.go b/uploader/upload.go index 57e426d..2832043 100644 --- a/uploader/upload.go +++ b/uploader/upload.go @@ -8,6 +8,7 @@ import ( "strconv" "time" + "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/resolver" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/response" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/tokens" @@ -77,7 +78,7 @@ func (u *Uploader) Upload(req *fasthttp.RequestCtx) { idCnr, err := utils.GetContainerID(ctx, scid, u.containerResolver) if err != nil { - log.Error("wrong container id", zap.Error(err)) + log.Error(logs.WrongContainerID, zap.Error(err)) response.Error(req, "wrong container id", fasthttp.StatusBadRequest) return } @@ -89,7 +90,7 @@ func (u *Uploader) Upload(req *fasthttp.RequestCtx) { } err := file.Close() log.Debug( - "close temporary multipart/form file", + logs.CloseTemporaryMultipartFormFile, zap.Stringer("address", addr), zap.String("filename", file.FileName()), zap.Error(err), @@ -97,13 +98,13 @@ func (u *Uploader) Upload(req *fasthttp.RequestCtx) { }() boundary := string(req.Request.Header.MultipartFormBoundary()) if file, err = fetchMultipartFile(u.log, bodyStream, boundary); err != nil { - log.Error("could not receive multipart/form", zap.Error(err)) + log.Error(logs.CouldNotReceiveMultipartForm, zap.Error(err)) response.Error(req, "could not receive multipart/form: "+err.Error(), fasthttp.StatusBadRequest) return } filtered, err := filterHeaders(u.log, &req.Request.Header) if err != nil { - log.Error("could not process headers", zap.Error(err)) + log.Error(logs.CouldNotProcessHeaders, zap.Error(err)) response.Error(req, err.Error(), fasthttp.StatusBadRequest) return } @@ -111,14 +112,14 @@ func (u *Uploader) Upload(req *fasthttp.RequestCtx) { now := time.Now() if rawHeader := req.Request.Header.Peek(fasthttp.HeaderDate); rawHeader != nil { if parsed, err := time.Parse(http.TimeFormat, string(rawHeader)); err != nil { - log.Warn("could not parse client time", zap.String("Date header", string(rawHeader)), zap.Error(err)) + log.Warn(logs.CouldNotParseClientTime, zap.String("Date header", string(rawHeader)), zap.Error(err)) } else { now = parsed } } if err = utils.PrepareExpirationHeader(req, u.pool, filtered, now); err != nil { - log.Error("could not prepare expiration header", zap.Error(err)) + log.Error(logs.CouldNotPrepareExpirationHeader, zap.Error(err)) response.Error(req, "could not prepare expiration header: "+err.Error(), fasthttp.StatusBadRequest) return } @@ -170,7 +171,7 @@ func (u *Uploader) Upload(req *fasthttp.RequestCtx) { // Try to return the response, otherwise, if something went wrong, throw an error. if err = newPutResponse(addr).encode(req); err != nil { - log.Error("could not encode response", zap.Error(err)) + log.Error(logs.CouldNotEncodeResponse, zap.Error(err)) response.Error(req, "could not encode response", fasthttp.StatusBadRequest) return @@ -196,7 +197,7 @@ func (u *Uploader) handlePutFrostFSErr(r *fasthttp.RequestCtx, err error) { statusCode, msg, additionalFields := response.FormErrorResponse("could not store file in frostfs", err) logFields := append([]zap.Field{zap.Error(err)}, additionalFields...) - u.log.Error("could not store file in frostfs", logFields...) + u.log.Error(logs.CouldNotStoreFileInFrostfs, logFields...) response.Error(r, msg, statusCode) }