From 6765b24345e7fe93e62b24a0a3aad4f78010d2bf Mon Sep 17 00:00:00 2001 From: Sushant Date: Thu, 3 Apr 2025 21:50:53 +0530 Subject: [PATCH 01/13] added logger interface and zerolog implementation --- lib/go.mod | 8 +++++++- lib/go.sum | 18 ++++++++++++++++++ lib/logger/logger.go | 38 ++++++++++++++++++++++++++++++++++++++ lib/logger/zerolog.go | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 lib/logger/logger.go create mode 100644 lib/logger/zerolog.go diff --git a/lib/go.mod b/lib/go.mod index c25849c..51f24ab 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -1,6 +1,8 @@ module github.com/Zomato/espresso/lib -go 1.22.4 +go 1.23.0 + +toolchain go1.23.1 require ( github.com/aws/aws-sdk-go-v2 v1.36.3 @@ -38,12 +40,16 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect github.com/aws/smithy-go v1.22.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rs/zerolog v1.34.0 // indirect github.com/ysmood/fetchup v0.3.0 // indirect github.com/ysmood/goob v0.4.0 // indirect github.com/ysmood/got v0.40.0 // indirect github.com/ysmood/gson v0.7.3 // indirect github.com/ysmood/leakless v0.9.0 // indirect golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/lib/go.sum b/lib/go.sum index 6055330..de136d8 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -38,6 +38,7 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5 github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/digitorus/pdf v0.1.2 h1:RjYEJNbiV6Kcn8QzRi6pwHuOaSieUUrg4EZo4b7KuIQ= @@ -51,14 +52,26 @@ github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA= github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg= github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM= github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/panjf2000/ants/v2 v2.11.2 h1:AVGpMSePxUNpcLaBO34xuIgM1ZdKOiGnpxLXixLi5Jo= github.com/panjf2000/ants/v2 v2.11.2/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/ysmood/fetchup v0.3.0 h1:UhYz9xnLEVn2ukSuK3KCgcznWpHMdrmbsPpllcylyu8= @@ -79,6 +92,11 @@ golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/lib/logger/logger.go b/lib/logger/logger.go new file mode 100644 index 0000000..10333f8 --- /dev/null +++ b/lib/logger/logger.go @@ -0,0 +1,38 @@ +package log + +import ( + "context" + "sync" +) + +var ( + once sync.Once + logger ILogger +) + +type Level uint8 + +const ( + DebugLevel Level = iota + Info + Warn + Error +) + +type ILogger interface { + Info(ctx context.Context, msg string) + Warn(ctx context.Context, msg string) + Error(ctx context.Context, msg string, err error) + Debug(ctx context.Context, msg string) +} + +func InitLogger() { + // Choose which logger to use. + + once.Do(func() { + zeroLog := newZeroLog() + logger = zeroLog + + logger.Info(context.Background(), "Logger: ZeroLog initialized") + }) +} diff --git a/lib/logger/zerolog.go b/lib/logger/zerolog.go new file mode 100644 index 0000000..c90ac93 --- /dev/null +++ b/lib/logger/zerolog.go @@ -0,0 +1,39 @@ +package log + +import ( + "context" + "os" + "time" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" +) + +type ZeroLog struct { + logger zerolog.Logger +} + +func newZeroLog() ZeroLog { + log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}) + zerolog.SetGlobalLevel(zerolog.DebugLevel) + + return ZeroLog{ + logger: log.Logger, + } +} + +func (l ZeroLog) Info(ctx context.Context, msg string) { + l.logger.Info().Msg(msg) +} + +func (l ZeroLog) Warn(ctx context.Context, msg string) { + l.logger.Warn().Msg(msg) +} + +func (l ZeroLog) Error(ctx context.Context, msg string, err error) { + l.logger.Err(err).Msg(msg) +} + +func (l ZeroLog) Debug(ctx context.Context, msg string) { + l.logger.Debug().Msg(msg) +} From 9c9c92dc08f492edd7f4ea8915b041cea215bb6f Mon Sep 17 00:00:00 2001 From: Sushant Date: Thu, 3 Apr 2025 22:08:57 +0530 Subject: [PATCH 02/13] added init logger in lib itself --- lib/logger/logger.go | 2 +- service/Dockerfile | 2 +- service/go.mod | 10 +++++++--- service/go.sum | 8 ++++---- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/logger/logger.go b/lib/logger/logger.go index 10333f8..266e835 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -26,7 +26,7 @@ type ILogger interface { Debug(ctx context.Context, msg string) } -func InitLogger() { +func init() { // Choose which logger to use. once.Do(func() { diff --git a/service/Dockerfile b/service/Dockerfile index 3e9131d..a4228fd 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.22.4-bullseye +FROM --platform=$BUILDPLATFORM golang:1.23.1-bullseye WORKDIR /app/espresso/ diff --git a/service/go.mod b/service/go.mod index 2f17ca4..e3a6317 100644 --- a/service/go.mod +++ b/service/go.mod @@ -1,14 +1,18 @@ module github.com/Zomato/espresso/service -go 1.22.4 +go 1.23.0 + +toolchain go1.23.1 require ( - github.com/Zomato/espresso/lib v0.0.0-20250316142812-954ffe9efdb5 + github.com/Zomato/espresso/lib v0.0.0-20250321161824-082e62c67636 github.com/go-rod/rod v0.116.2 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.10.0 ) +replace github.com/Zomato/espresso/lib => ../lib + require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect @@ -64,7 +68,7 @@ require ( golang.org/x/crypto v0.33.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect + golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.22.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/service/go.sum b/service/go.sum index 4c740ff..5e5b8fc 100644 --- a/service/go.sum +++ b/service/go.sum @@ -1,7 +1,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/Zomato/espresso/lib v0.0.0-20250316142812-954ffe9efdb5 h1:EV7367gnsGq9gCKTa2CXfmZoo9bMkHG4k9fSUqKkxYA= -github.com/Zomato/espresso/lib v0.0.0-20250316142812-954ffe9efdb5/go.mod h1:kLwZ8Pdcx3k5UepIeNTCTKT0+/T78gYLmXFO9O+Ew54= +github.com/Zomato/espresso/lib v0.0.0-20250321161824-082e62c67636 h1:bVOkVCDXWE4jHtD0e1/Du1TT2zK0HtfMVOZDZ8EjC7Y= +github.com/Zomato/espresso/lib v0.0.0-20250321161824-082e62c67636/go.mod h1:kLwZ8Pdcx3k5UepIeNTCTKT0+/T78gYLmXFO9O+Ew54= github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= @@ -135,8 +135,8 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjs golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From ac702644c651fb5ae05477d8a9566802ad1ae517 Mon Sep 17 00:00:00 2001 From: Sushant Date: Thu, 3 Apr 2025 23:02:16 +0530 Subject: [PATCH 03/13] Dockerfile changes to run project --- lib/logger/logger.go | 6 +++--- service/Dockerfile | 6 ++++++ service/go.mod | 3 +++ service/go.sum | 18 ++++++++++++++++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/logger/logger.go b/lib/logger/logger.go index 266e835..6033d8a 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -7,7 +7,7 @@ import ( var ( once sync.Once - logger ILogger + Logger ILogger ) type Level uint8 @@ -31,8 +31,8 @@ func init() { once.Do(func() { zeroLog := newZeroLog() - logger = zeroLog + Logger = zeroLog - logger.Info(context.Background(), "Logger: ZeroLog initialized") + Logger.Info(context.Background(), "Logger: ZeroLog initialized") }) } diff --git a/service/Dockerfile b/service/Dockerfile index a4228fd..ea6b21a 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -19,6 +19,8 @@ ENV GOSUMDB=off \ # Copy go.mod and go.sum first to leverage Docker cache COPY service/go.mod service/go.sum ./service/ +COPY lib /app/espresso/lib/ + # Download dependencies RUN cd service && \ go mod download @@ -63,6 +65,10 @@ RUN chown -R chrome:chrome /app # Set the user to chrome for the container USER chrome +# To download dependencies as non root user +ENV GOPATH=/home/chrome/go +RUN mkdir -p $GOPATH/pkg/mod && chmod -R 777 $GOPATH/pkg/mod + EXPOSE 8081 # Change the CMD to run the Go application directly diff --git a/service/go.mod b/service/go.mod index e3a6317..5a15005 100644 --- a/service/go.mod +++ b/service/go.mod @@ -48,9 +48,12 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattetti/filebuffer v1.0.1 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/panjf2000/ants/v2 v2.11.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/rs/zerolog v1.34.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect diff --git a/service/go.sum b/service/go.sum index 5e5b8fc..06cfb15 100644 --- a/service/go.sum +++ b/service/go.sum @@ -1,7 +1,5 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/Zomato/espresso/lib v0.0.0-20250321161824-082e62c67636 h1:bVOkVCDXWE4jHtD0e1/Du1TT2zK0HtfMVOZDZ8EjC7Y= -github.com/Zomato/espresso/lib v0.0.0-20250321161824-082e62c67636/go.mod h1:kLwZ8Pdcx3k5UepIeNTCTKT0+/T78gYLmXFO9O+Ew54= github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= @@ -40,6 +38,7 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5 github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -59,6 +58,7 @@ github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA= github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg= github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -73,17 +73,28 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM= github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/panjf2000/ants/v2 v2.11.2 h1:AVGpMSePxUNpcLaBO34xuIgM1ZdKOiGnpxLXixLi5Jo= github.com/panjf2000/ants/v2 v2.11.2/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -135,6 +146,9 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjs golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= From 915145a89b1d5162e1d42ffcc8b239856f95911f Mon Sep 17 00:00:00 2001 From: Sushant Date: Fri, 4 Apr 2025 07:11:56 +0530 Subject: [PATCH 04/13] added no-op logger --- lib/logger/logger.go | 14 ++++++++------ lib/logger/no-op.go | 19 +++++++++++++++++++ lib/logger/zerolog.go | 24 ++++++++++++++++-------- 3 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 lib/logger/no-op.go diff --git a/lib/logger/logger.go b/lib/logger/logger.go index 6033d8a..c500c6f 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -7,7 +7,7 @@ import ( var ( once sync.Once - Logger ILogger + Logger ILogger = newNoOpLogger() ) type Level uint8 @@ -19,11 +19,13 @@ const ( Error ) +type Fields map[string]any + type ILogger interface { - Info(ctx context.Context, msg string) - Warn(ctx context.Context, msg string) - Error(ctx context.Context, msg string, err error) - Debug(ctx context.Context, msg string) + Info(ctx context.Context, msg string, fields Fields) + Warn(ctx context.Context, msg string, fields Fields) + Error(ctx context.Context, msg string, err error, fields Fields) + Debug(ctx context.Context, msg string, fields Fields) } func init() { @@ -33,6 +35,6 @@ func init() { zeroLog := newZeroLog() Logger = zeroLog - Logger.Info(context.Background(), "Logger: ZeroLog initialized") + Logger.Info(context.Background(), "Logger: ZeroLog initialized", nil) }) } diff --git a/lib/logger/no-op.go b/lib/logger/no-op.go new file mode 100644 index 0000000..7d0900a --- /dev/null +++ b/lib/logger/no-op.go @@ -0,0 +1,19 @@ +package log + +import ( + "context" +) + +type NoOpLogger struct{} + +func newNoOpLogger() NoOpLogger { + return NoOpLogger{} +} + +func (n NoOpLogger) Info(ctx context.Context, msg string, fields Fields) {} + +func (n NoOpLogger) Warn(ctx context.Context, msg string, fields Fields) {} + +func (n NoOpLogger) Error(ctx context.Context, msg string, err error, fields Fields) {} + +func (n NoOpLogger) Debug(ctx context.Context, msg string, fields Fields) {} diff --git a/lib/logger/zerolog.go b/lib/logger/zerolog.go index c90ac93..e6a446e 100644 --- a/lib/logger/zerolog.go +++ b/lib/logger/zerolog.go @@ -22,18 +22,26 @@ func newZeroLog() ZeroLog { } } -func (l ZeroLog) Info(ctx context.Context, msg string) { - l.logger.Info().Msg(msg) +func addFields(event *zerolog.Event, fields map[string]any) *zerolog.Event { + for k, v := range fields { + event.Interface(k, v) + } + + return event +} + +func (l ZeroLog) Info(ctx context.Context, msg string, fields Fields) { + addFields(l.logger.Info(), fields).Msg(msg) } -func (l ZeroLog) Warn(ctx context.Context, msg string) { - l.logger.Warn().Msg(msg) +func (l ZeroLog) Warn(ctx context.Context, msg string, fields Fields) { + addFields(l.logger.Warn(), fields).Msg(msg) } -func (l ZeroLog) Error(ctx context.Context, msg string, err error) { - l.logger.Err(err).Msg(msg) +func (l ZeroLog) Error(ctx context.Context, msg string, err error, fields Fields) { + addFields(l.logger.Err(err), fields).Msg(msg) } -func (l ZeroLog) Debug(ctx context.Context, msg string) { - l.logger.Debug().Msg(msg) +func (l ZeroLog) Debug(ctx context.Context, msg string, fields Fields) { + addFields(l.logger.Debug(), fields).Msg(msg) } From 6dc9646d1a64a60fe0876993f60d83b8504fcfce Mon Sep 17 00:00:00 2001 From: Sushant Date: Fri, 4 Apr 2025 08:35:50 +0530 Subject: [PATCH 05/13] added logger in lib --- lib/browser_manager/initialize.go | 18 ++++++++++++----- lib/browser_manager/tabManager.go | 14 +++++++++---- lib/certmanager/certmanager.go | 22 +++++++++++++++++++++ lib/renderer/parser.go | 4 ++++ lib/renderer/pdf.go | 32 +++++++++++++++++++++--------- lib/renderer/prefetchImages.go | 33 ++++++++++++++++++++----------- lib/signer/appearance.go | 13 ++++++++++++ lib/signer/object.go | 13 ++++++++++++ lib/signer/signature.go | 24 ++++++++++++++++++++-- lib/signer/signer.go | 22 +++++++++++++++++++++ lib/signer/timestamp.go | 11 +++++++++++ lib/signer/utils.go | 5 +++++ lib/signer/xref.go | 22 +++++++++++++++++++++ lib/templatestore/diskstore.go | 10 ++++++++++ lib/templatestore/mysqlstore.go | 3 ++- lib/templatestore/s3store.go | 5 +++++ lib/templatestore/streamstore.go | 5 +++++ lib/workerpool/pool.go | 6 ++++-- 18 files changed, 227 insertions(+), 35 deletions(-) diff --git a/lib/browser_manager/initialize.go b/lib/browser_manager/initialize.go index b77f28a..4e1604c 100644 --- a/lib/browser_manager/initialize.go +++ b/lib/browser_manager/initialize.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + log "github.com/Zomato/espresso/lib/logger" "github.com/go-rod/rod" "github.com/go-rod/rod/lib/launcher" ) @@ -14,10 +15,13 @@ var ( ) func Init(ctx context.Context, tabPool int) error { - fmt.Println("Initializing browser...") + log.Logger.Info(ctx, "Initializing Browser...", nil) + browserPath := os.Getenv("ROD_BROWSER_BIN") if browserPath == "" { - return fmt.Errorf("ROD_BROWSER_BIN environment variable not set") + err := fmt.Errorf("ROD_BROWSER_BIN environment variable not set") + log.Logger.Error(ctx, "ENV Missing", err, nil) + return err } launcher := launcher.New().Bin(browserPath). @@ -72,17 +76,21 @@ func Init(ctx context.Context, tabPool int) error { url, err := launcher.Launch() if err != nil { - return fmt.Errorf("failed to launch browser: %v", err) + err := fmt.Errorf("failed to launch browser: %v", err) + log.Logger.Error(ctx, "", err, nil) + return err } fmt.Printf("Browser launched at URL: %s\n", url) browser := rod.New().ControlURL(url) if err := browser.Connect(); err != nil { - return fmt.Errorf("failed to connect to browser: %v", err) + err := fmt.Errorf("failed to connect to browser: %v", err) + log.Logger.Error(ctx, "", err, nil) + return err } Browser = browser - fmt.Println("Browser connected successfully") + log.Logger.Info(ctx, "Browser Connected Successfully", nil) InitializeTabManager(ctx, tabPool) diff --git a/lib/browser_manager/tabManager.go b/lib/browser_manager/tabManager.go index 8019400..6856aea 100644 --- a/lib/browser_manager/tabManager.go +++ b/lib/browser_manager/tabManager.go @@ -5,6 +5,7 @@ import ( "fmt" "sync" + log "github.com/Zomato/espresso/lib/logger" "github.com/go-rod/rod" ) @@ -25,7 +26,9 @@ func InitializeTabManager(ctx context.Context, tabPool int) { } func NewTabPool(ctx context.Context, browser *rod.Browser, tabPool int) *TabPool { - fmt.Println("Initializing tab pool with ", tabPool, " tabs") + + log.Logger.Info(ctx, "Initializing tab pool", map[string]any{"totalTabs": tabPool}) + numTabs = tabPool if tabPool == 0 { return nil @@ -48,7 +51,8 @@ func NewTabPool(ctx context.Context, browser *rod.Browser, tabPool int) *TabPool // if the `browser.tabs` is 0 then we are creating a new tab on each request func GetTab() *rod.Page { - fmt.Println("Getting tab") + log.Logger.Info(context.Background(), "Getting tab", nil) + if numTabs == 0 { return Browser.MustPage("about:blank") } @@ -58,7 +62,7 @@ func GetTab() *rod.Page { } func ReleaseTab(page *rod.Page) { - fmt.Println("Releasing tab") + log.Logger.Info(context.Background(), "Releasing Tab", nil) if numTabs == 0 { page.MustClose() return @@ -90,7 +94,9 @@ func removeBlobURL(page *rod.Page, blobURL string) error { }`, blobURL) if err != nil { - return fmt.Errorf("failed to execute JavaScript for blob URL: %v", err) + err := fmt.Errorf("failed to execute JavaScript for blob URL: %v", err) + log.Logger.Error(context.Background(), "JS Execution Failed", err, nil) + return err } return nil diff --git a/lib/certmanager/certmanager.go b/lib/certmanager/certmanager.go index 6ec4ed9..6cdc73c 100644 --- a/lib/certmanager/certmanager.go +++ b/lib/certmanager/certmanager.go @@ -11,6 +11,8 @@ import ( "fmt" "os" "os/exec" + + log "github.com/Zomato/espresso/lib/logger" ) // SigningCredentials holds the certificate and private key for PDF signing @@ -29,11 +31,13 @@ func LoadSigningCredentials(ctx context.Context, certConfig *CertificateConfig) cert, err := getCertificate(certConfig.CertFilePath) if err != nil { + log.Logger.Error(ctx, "failed to get certificate", err, nil) return nil, fmt.Errorf("failed to get certificate: %v", err) } privateKey, err := getKey(certConfig.KeyFilePath, certConfig.KeyPassword) if err != nil { + log.Logger.Error(ctx, "failed to get certificate", err, nil) return nil, fmt.Errorf("failed to get private key: %v", err) } @@ -44,33 +48,40 @@ func LoadSigningCredentials(ctx context.Context, certConfig *CertificateConfig) } func getCertificate(certPath string) (*x509.Certificate, error) { + ctx := context.Background() certBytes, err := os.ReadFile(certPath) if err != nil { + log.Logger.Error(ctx, "failed to read certificate file", err, nil) return nil, fmt.Errorf("failed to read certificate file: %v", err) } certBlock, _ := pem.Decode(certBytes) if certBlock == nil { + log.Logger.Error(ctx, "failed to decode certificate PEN", nil, nil) return nil, fmt.Errorf("failed to decode certificate PEM") } cert, err := x509.ParseCertificate(certBlock.Bytes) if err != nil { + log.Logger.Error(ctx, "failed to parse certificate", err, nil) return nil, fmt.Errorf("failed to parse certificate: %v", err) } return cert, nil } func getKey(keyPath, password string) (crypto.Signer, error) { + ctx := context.Background() keyBytes, err := os.ReadFile(keyPath) if err != nil { + log.Logger.Error(ctx, "failed to read private key file", err, nil) return nil, fmt.Errorf("failed to read private key file: %v", err) } privateKey, err := loadPrivateKey(keyBytes, password) if err != nil { + log.Logger.Error(ctx, "failed to load private key", err, nil) return nil, fmt.Errorf("failed to load private key: %v", err) } @@ -78,8 +89,11 @@ func getKey(keyPath, password string) (crypto.Signer, error) { } func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { + ctx := context.Background() + block, _ := pem.Decode(keyBytes) if block == nil { + log.Logger.Error(ctx, "failed to decode PEM block", nil, nil) return nil, fmt.Errorf("failed to decode PEM block") } @@ -87,6 +101,7 @@ func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { // For PKCS#8 encrypted keys key, err := parseEncryptedPKCS8PrivateKey(block.Bytes, []byte(password)) if err != nil { + log.Logger.Error(ctx, "failed to parse encrypted PKCS#8 private key", err, nil) return nil, fmt.Errorf("failed to parse encrypted PKCS#8 private key: %w", err) } @@ -96,12 +111,14 @@ func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { case *ecdsa.PrivateKey: return k, nil default: + log.Logger.Error(ctx, "unsupported private key type", nil, nil) return nil, fmt.Errorf("unsupported private key type") } } else if block.Type == "PRIVATE KEY" { // For unencrypted PKCS#8 keys key, err := x509.ParsePKCS8PrivateKey(block.Bytes) if err != nil { + log.Logger.Error(ctx, "failed to parse PKCS#8 private key", err, nil) return nil, fmt.Errorf("failed to parse PKCS#8 private key: %w", err) } @@ -111,15 +128,18 @@ func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { case *ecdsa.PrivateKey: return k, nil default: + log.Logger.Error(ctx, "unsupported private key type", nil, nil) return nil, fmt.Errorf("unsupported private key type") } } else { + log.Logger.Error(ctx, "unsupported private key format", nil, map[string]any{"key_type": block.Type}) return nil, fmt.Errorf("unsupported private key format: %s", block.Type) } } // Helper function to parse PKCS#8 encrypted private keys func parseEncryptedPKCS8PrivateKey(data, password []byte) (interface{}, error) { + ctx := context.Background() var privKey interface{} // First try direct parsing (for some implementations) @@ -157,6 +177,7 @@ func parseEncryptedPKCS8PrivateKey(data, password []byte) (interface{}, error) { cmd.Stderr = &stderr if err := cmd.Run(); err != nil { + log.Logger.Error(ctx, "OpenSSL error", err, nil) return nil, fmt.Errorf("OpenSSL error: %v, %s", err, stderr.String()) } @@ -168,6 +189,7 @@ func parseEncryptedPKCS8PrivateKey(data, password []byte) (interface{}, error) { decryptedBlock, _ := pem.Decode(decryptedData) if decryptedBlock == nil { + log.Logger.Error(ctx, "failed to decode decrypted PEM block", nil, nil) return nil, fmt.Errorf("failed to decode decrypted PEM block") } diff --git a/lib/renderer/parser.go b/lib/renderer/parser.go index fb0c418..4f41867 100644 --- a/lib/renderer/parser.go +++ b/lib/renderer/parser.go @@ -7,6 +7,8 @@ import ( "strings" "sync" "text/template" + + log "github.com/Zomato/espresso/lib/logger" ) var bufferPool = sync.Pool{ @@ -19,6 +21,7 @@ func ExecuteTemplate(ctx context.Context, templateFile *template.Template, data // Validate template and data if templateFile == nil { + log.Logger.Error(ctx, "template file is nil", nil, nil) return "", fmt.Errorf("template file is nil") } @@ -29,6 +32,7 @@ func ExecuteTemplate(ctx context.Context, templateFile *template.Template, data // Execute template with buffered writer if err := templateFile.Execute(buf, data); err != nil { + log.Logger.Error(ctx, "failed to execute template", err, nil) return "", fmt.Errorf("failed to execute template: %w", err) } diff --git a/lib/renderer/pdf.go b/lib/renderer/pdf.go index d97e7ee..6dbc97f 100644 --- a/lib/renderer/pdf.go +++ b/lib/renderer/pdf.go @@ -8,6 +8,7 @@ import ( "time" "github.com/Zomato/espresso/lib/browser_manager" + log "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/templatestore" "github.com/go-rod/rod" ) @@ -16,36 +17,43 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp startTime := time.Now() if params == nil { + log.Logger.Error(ctx, "params are required", nil, nil) return nil, fmt.Errorf("params are required") } duration := time.Since(startTime) - fmt.Println("starting template parsing at :: ", duration) + + log.Logger.Info(ctx, "starting template parsing at", map[string]any{"time": duration}) + var err error var templateFile *template.Template if storeAdapter != nil { templateFile, err = (*storeAdapter).GetTemplate(ctx, ¶ms.TemplateRequest) if err != nil { + log.Logger.Error(ctx, "unable to get template file from store", err, nil) return nil, fmt.Errorf("unable to get template file from store: %v", err) } } else { if len(params.TemplateRequest.TemplateBytes) > 0 { templateFile, err = template.New("stream").Parse(string(params.TemplateRequest.TemplateBytes)) if err != nil { + log.Logger.Error(ctx, "unable to parse template file", err, nil) return nil, fmt.Errorf("unable to parse template file: %v", err) } } else { + log.Logger.Error(ctx, "storage configuration is invalid", nil, nil) return nil, fmt.Errorf("storage configuration is invalid") } } duration = time.Since(startTime) - fmt.Println("starting unmarshaling data at :: ", duration) + log.Logger.Info(ctx, "starting unmarshaling data at", map[string]any{"time": duration}) data := params.Data var unmarshaledData map[string]interface{} if err := json.Unmarshal(data, &unmarshaledData); err != nil { + log.Logger.Error(ctx, "unable to unmarshal JSON data", err, nil) return nil, fmt.Errorf("unable to unmarshal JSON data: %v", err) } @@ -57,26 +65,27 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp page := browser_manager.GetTab() defer func() { duration = time.Since(startTime) - fmt.Println("closing tab at :: ", duration) + log.Logger.Info(ctx, "closing tab at", map[string]any{"time": duration}) browser_manager.ReleaseTab(page) }() duration = time.Since(startTime) - fmt.Println("prefetching images at :: ", duration) + log.Logger.Info(ctx, "prefetching images at", map[string]any{"time": duration}) unmarshaledData = PrefetchImages(ctx, unmarshaledData) duration = time.Since(startTime) - fmt.Println("unmarshaled data & started template execution at :: ", duration) + log.Logger.Info(ctx, "unmarshaled data & started template execution at", map[string]any{"time": duration}) htmlContent, err := ExecuteTemplate(ctx, templateFile, unmarshaledData) if err != nil { + log.Logger.Error(ctx, "unable to execute template file", err, nil) return nil, fmt.Errorf("unable to execute template file: %v", err) } htmlContent = AddImagesFromMetaData(ctx, htmlContent, unmarshaledData) duration = time.Since(startTime) - fmt.Println("template executed and requesting new tab at :: ", duration) + log.Logger.Info(ctx, "template executed and requesting new tab at", map[string]any{"time": duration}) if params.IsSinglePage { page.MustSetViewport(794, 1124, 1.0, false) @@ -86,10 +95,11 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp } duration = time.Since(startTime) - fmt.Println("rendering data in new tab at :: ", duration) + log.Logger.Info(ctx, "rendering data in new tab at", map[string]any{"time": duration}) err = page.SetDocumentContent(string(htmlContent)) if err != nil { + log.Logger.Error(ctx, "unable to generate pdf", err, nil) return nil, fmt.Errorf("unable to generate pdf: %v", err) } @@ -99,16 +109,19 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp err = page.WaitLoad() if err != nil { + log.Logger.Error(ctx, "error in waiting for page load", err, nil) return nil, fmt.Errorf("error in waiting for page load: %v", err) } body, err := page.Element("html") if err != nil { + log.Logger.Error(ctx, "error in getting html element", err, nil) return nil, fmt.Errorf("error in getting html element: %v", err) } heightProp, err := body.Property("scrollHeight") if err != nil { + log.Logger.Error(ctx, "error in getting scroll height", err, nil) return nil, fmt.Errorf("error in getting scroll height: %v", err) } @@ -120,15 +133,16 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp } duration = time.Since(startTime) - fmt.Println("generating pdf at :: ", duration) + log.Logger.Info(ctx, "generating pdf at", map[string]any{"time": duration}) pdfStream, err := page.PDF(pdfParams) if err != nil { + log.Logger.Error(ctx, "unable to generate pdf", err, nil) return nil, fmt.Errorf("unable to generate pdf: %v", err) } duration = time.Since(startTime) - fmt.Println("pdf generated at :: ", duration) + log.Logger.Info(ctx, "pdf generated at", map[string]any{"time": duration}) return pdfStream, nil } diff --git a/lib/renderer/prefetchImages.go b/lib/renderer/prefetchImages.go index 3d57ff6..d07419c 100644 --- a/lib/renderer/prefetchImages.go +++ b/lib/renderer/prefetchImages.go @@ -11,6 +11,7 @@ import ( "sync" "time" + log "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/workerpool" ) @@ -45,23 +46,26 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string wg.Done() if r := recover(); r != nil { err := fmt.Errorf("panic: %v and stacktrace %s", r, string(debug.Stack())) - fmt.Println("Recovered from panic: ", err) + log.Logger.Info(ctx, "recovered from panic", map[string]any{"error": err}) + } }() var dataURI string var err error if strings.HasPrefix(v, "https://") { duration := time.Since(startTime) - fmt.Printf("fetching %s image at :: %s\n", v, duration) + log.Logger.Info(ctx, "fetching image at", map[string]any{"name": v, "time": duration}) + dataURI, err = fetchImageAsDataURIFromURL(v) if err != nil { - fmt.Printf("failed to download image for key %s: %v\n", k, err) + log.Logger.Error(ctx, "failed to download image", err, map[string]any{"key": k}) return } } if dataURI == "" { - fmt.Printf("failed to download image for key %s: dataURI is empty\n", k) + log.Logger.Error(ctx, "failed to download image. data uri is empty", nil, map[string]any{"key": k}) + mu.Lock() parentData[k] = "" mu.Unlock() @@ -69,15 +73,15 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string } duration := time.Since(startTime) - fmt.Printf("fetched %s image data at :: %s\n", v, duration) + log.Logger.Info(ctx, "fetched image data at", map[string]any{"time": duration, "image": v}) mu.Lock() parentData[k] = dataURI mu.Unlock() - fmt.Printf("replaced image data for key %s at :: %s, error :: %v\n", k, duration, err) + log.Logger.Info(ctx, "replaced image data at", map[string]any{"time": duration, "key": k, "error": err}) }, key, strValue, current.data) if err != nil { - fmt.Printf("failed to submit task to worker pool: %v\n", err) + log.Logger.Error(ctx, "failed to submit task to worker pool", err, nil) } } else if nestedMap, ok := value.(map[string]interface{}); ok { stack = append(stack, stackItem{key: key, data: nestedMap}) @@ -94,12 +98,12 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string } duration := time.Since(startTime) - fmt.Println("prefetching images completed at :: ", duration) + log.Logger.Info(ctx, "prefetching images completed at", map[string]any{"time": duration}) wg.Wait() duration = time.Since(startTime) - fmt.Println("all worker pool tasks completed at :: ", duration) + log.Logger.Info(ctx, "all worker pool tasks completed at", map[string]any{"time": duration}) return data } @@ -107,26 +111,30 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string // Fetch an image and convert it to a data URI func fetchImageAsDataURIFromURL(url string) (string, error) { startTime := time.Now() + ctx := context.Background() duration := time.Since(startTime) - fmt.Printf("fetching %s image at :: %s\n", url, duration) + log.Logger.Info(context.Background(), "fetching image at", map[string]any{"time": duration, "url": url}) resp, err := http.Get(url) if err != nil { + log.Logger.Error(ctx, "failed to fetch image", err, nil) return "", fmt.Errorf("failed to fetch image: %v", err) } duration = time.Since(startTime) - fmt.Printf("fetched %s image data at :: %s\n", url, duration) + log.Logger.Info(context.Background(), "fetched image at", map[string]any{"time": duration, "url": url}) defer resp.Body.Close() if resp.StatusCode != http.StatusOK { + log.Logger.Error(ctx, "failed to fetch image", nil, map[string]any{"status_code": resp.StatusCode}) return "", fmt.Errorf("failed to fetch image, status code: %d", resp.StatusCode) } imageBytes, err := io.ReadAll(resp.Body) if err != nil { + log.Logger.Error(ctx, "failed to read image bytes", err, nil) return "", fmt.Errorf("failed to read image bytes: %v", err) } @@ -140,6 +148,7 @@ func fetchImageAsDataURIFromURL(url string) (string, error) { dataURI := fmt.Sprintf("data:%s;base64,%s", contentType, base64.StdEncoding.EncodeToString(imageBytes)) duration = time.Since(startTime) - fmt.Printf("returning %s image data at :: %s\n", url, duration) + log.Logger.Info(context.Background(), "returning image at", map[string]any{"time": duration, "url": url}) + return dataURI, nil } diff --git a/lib/signer/appearance.go b/lib/signer/appearance.go index bca66ac..d48b38e 100644 --- a/lib/signer/appearance.go +++ b/lib/signer/appearance.go @@ -2,11 +2,16 @@ package signer import ( "bytes" + cContext "context" "fmt" "strconv" + + log "github.com/Zomato/espresso/lib/logger" ) func (context *SignContext) createVisualSignature(visible bool, pageNumber uint32, rect [4]float64) ([]byte, error) { + ctx := cContext.Background() + var visual_signature bytes.Buffer visual_signature.WriteString("<<\n") @@ -21,11 +26,13 @@ func (context *SignContext) createVisualSignature(visible bool, pageNumber uint3 appearance, err := context.createAppearance(rect) if err != nil { + log.Logger.Error(ctx, "failed to create appearance", err, nil) return nil, fmt.Errorf("failed to create appearance: %w", err) } appearanceObjectId, err := context.addObject(appearance) if err != nil { + log.Logger.Error(ctx, "failed to add appearance object", err, nil) return nil, fmt.Errorf("failed to add appearance object: %w", err) } @@ -119,12 +126,18 @@ func (context *SignContext) createIncPageUpdate(pageNumber, annot uint32) ([]byt } func (context *SignContext) createAppearance(rect [4]float64) ([]byte, error) { + ctx := cContext.Background() + text := context.SignData.Signature.Info.Name rectWidth := rect[2] - rect[0] rectHeight := rect[3] - rect[1] if rectWidth < 1 || rectHeight < 1 { + log.Logger.Error(ctx, "inavlid rectangl dimensions", nil, map[string]any{ + "width": rectWidth, + "height": rectHeight, + }) return nil, fmt.Errorf("invalid rectangle dimensions: width %.2f and height %.2f must be greater than 0", rectWidth, rectHeight) } diff --git a/lib/signer/object.go b/lib/signer/object.go index 84247eb..34e2c23 100644 --- a/lib/signer/object.go +++ b/lib/signer/object.go @@ -3,12 +3,19 @@ package signer import ( "bytes" "fmt" + + cContext "context" + + log "github.com/Zomato/espresso/lib/logger" ) func (context *SignContext) addObject(object []byte) (uint32, error) { + ctx := cContext.Background() + if context.lastXrefID == 0 { lastXrefID, err := context.getLastObjectIDFromXref() if err != nil { + log.Logger.Error(ctx, "failed to get last object ID", err, nil) return 0, fmt.Errorf("failed to get last object ID: %w", err) } context.lastXrefID = lastXrefID @@ -22,6 +29,7 @@ func (context *SignContext) addObject(object []byte) (uint32, error) { err := context.writeObject(objectID, object) if err != nil { + log.Logger.Error(ctx, "failed to write object", err, nil) return 0, fmt.Errorf("failed to write object: %w", err) } @@ -36,6 +44,7 @@ func (context *SignContext) updateObject(id uint32, object []byte) error { err := context.writeObject(id, object) if err != nil { + log.Logger.Error(cContext.Background(), "failed to write object", err, nil) return fmt.Errorf("failed to write object: %w", err) } @@ -43,17 +52,21 @@ func (context *SignContext) updateObject(id uint32, object []byte) error { } func (context *SignContext) writeObject(id uint32, object []byte) error { + ctx := cContext.Background() if _, err := context.OutputBuffer.Write([]byte(fmt.Sprintf("\n%d 0 obj\n", id))); err != nil { + log.Logger.Error(ctx, "failed to write object header", err, nil) return fmt.Errorf("failed to write object header: %w", err) } object = bytes.TrimSpace(object) if _, err := context.OutputBuffer.Write(object); err != nil { + log.Logger.Error(ctx, "failed to write object content", err, nil) return fmt.Errorf("failed to write object content: %w", err) } if _, err := context.OutputBuffer.Write([]byte(objectFooter)); err != nil { + log.Logger.Error(ctx, "failed to write object footer", err, nil) return fmt.Errorf("failed to write object footer: %w", err) } diff --git a/lib/signer/signature.go b/lib/signer/signature.go index 03edc3a..a2c46d1 100644 --- a/lib/signer/signature.go +++ b/lib/signer/signature.go @@ -7,14 +7,17 @@ import ( "encoding/asn1" "encoding/hex" "fmt" - "log" + "strconv" "strings" + log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/pkcs7" "github.com/digitorus/timestamp" "golang.org/x/crypto/cryptobyte" + cContext "context" + cryptobyte_asn1 "golang.org/x/crypto/cryptobyte/asn1" ) @@ -154,6 +157,8 @@ func (context *SignContext) createTimestampPlaceholder() []byte { } func (context *SignContext) createSignature() ([]byte, error) { + ctx := cContext.Background() + if _, err := context.OutputBuffer.Seek(0, 0); err != nil { return nil, err } @@ -168,11 +173,13 @@ func (context *SignContext) createSignature() ([]byte, error) { timestamp_response, err := context.GetTSA(sign_content) if err != nil { + log.Logger.Error(ctx, "get timestamp", err, nil) return nil, fmt.Errorf("get timestamp: %w", err) } ts, err := timestamp.ParseResponse(timestamp_response) if err != nil { + log.Logger.Error(ctx, "parse timestamp", err, nil) return nil, fmt.Errorf("parse timestamp: %w", err) } @@ -181,12 +188,14 @@ func (context *SignContext) createSignature() ([]byte, error) { signed_data, err := pkcs7.NewSignedData(sign_content) if err != nil { + log.Logger.Error(ctx, "new signed data", err, nil) return nil, fmt.Errorf("new signed data: %w", err) } signed_data.SetDigestAlgorithm(getOIDFromHashAlgorithm(context.SignData.DigestAlgorithm)) signingCertificate, err := context.createSigningCertificateAttribute() if err != nil { + log.Logger.Error(ctx, "new signed data", err, nil) return nil, fmt.Errorf("new signed data: %w", err) } @@ -206,6 +215,7 @@ func (context *SignContext) createSignature() ([]byte, error) { } if err := signed_data.AddSignerChain(context.SignData.Certificate, context.SignData.Signer, certificate_chain, signer_config); err != nil { + log.Logger.Error(ctx, "added signer chain", err, nil) return nil, fmt.Errorf("add signer chain: %w", err) } @@ -216,16 +226,19 @@ func (context *SignContext) createSignature() ([]byte, error) { timestamp_response, err := context.GetTSA(signature_data.SignerInfos[0].EncryptedDigest) if err != nil { + log.Logger.Error(ctx, "get timestamp", err, nil) return nil, fmt.Errorf("get timestamp: %w", err) } ts, err := timestamp.ParseResponse(timestamp_response) if err != nil { + log.Logger.Error(ctx, "parse timestamp", err, nil) return nil, fmt.Errorf("parse timestamp: %w", err) } _, err = pkcs7.Parse(ts.RawToken) if err != nil { + log.Logger.Error(ctx, "parse timestamp token", err, nil) return nil, fmt.Errorf("parse timestamp token: %w", err) } @@ -275,6 +288,8 @@ func (context *SignContext) createSigningCertificateAttribute() (*pkcs7.Attribut } func (context *SignContext) updateByteRange() error { + ctx := cContext.Background() + if _, err := context.OutputBuffer.Seek(0, 0); err != nil { return err } @@ -282,6 +297,7 @@ func (context *SignContext) updateByteRange() error { contentsPlaceholder := bytes.Repeat([]byte("0"), int(context.SignatureMaxLength)) contentsIndex := bytes.Index(context.OutputBuffer.Buff.Bytes(), contentsPlaceholder) if contentsIndex == -1 { + log.Logger.Error(ctx, "failed to find contents placeholder", nil, nil) return fmt.Errorf("failed to find contents placeholder") } @@ -299,11 +315,13 @@ func (context *SignContext) updateByteRange() error { if len(new_byte_range) < len(signatureByteRangePlaceholder) { new_byte_range += strings.Repeat(" ", len(signatureByteRangePlaceholder)-len(new_byte_range)) } else if len(new_byte_range) != len(signatureByteRangePlaceholder) { + log.Logger.Error(ctx, "new byte range string is the same length as the placeholder", nil, nil) return fmt.Errorf("new byte range string is the same lenght as the placeholder") } placeholderIndex := bytes.Index(context.OutputBuffer.Buff.Bytes(), []byte(signatureByteRangePlaceholder)) if placeholderIndex == -1 { + log.Logger.Error(ctx, "failed to find ByteRange placeholder", nil, nil) return fmt.Errorf("failed to find ByteRange placeholder") } @@ -319,8 +337,10 @@ func (context *SignContext) updateByteRange() error { } func (context *SignContext) replaceSignature() error { + signature, err := context.createSignature() if err != nil { + log.Logger.Error(cContext.Background(), "failed to create signature", err, nil) return fmt.Errorf("failed to create signature: %w", err) } @@ -328,7 +348,7 @@ func (context *SignContext) replaceSignature() error { hex.Encode(dst, signature) if uint32(len(dst)) > context.SignatureMaxLength { - log.Println("Signature too long, retrying with increased buffer size.") + log.Logger.Info(cContext.Background(), "Signature too long, retrying with increased buffer size", nil) context.SignatureMaxLengthBase += (uint32(len(dst)) - context.SignatureMaxLength) + 1 return context.SignPDF() diff --git a/lib/signer/signer.go b/lib/signer/signer.go index 9f47201..e0f4b16 100644 --- a/lib/signer/signer.go +++ b/lib/signer/signer.go @@ -10,9 +10,12 @@ import ( "io" "time" + log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/pdf" "github.com/digitorus/pkcs7" "github.com/mattetti/filebuffer" + + cContext "context" ) func Sign(input io.ReadSeeker, output io.Writer, rdr *pdf.Reader, size int64, sign_data SignData) error { @@ -41,6 +44,7 @@ func Sign(input io.ReadSeeker, output io.Writer, rdr *pdf.Reader, size int64, si } func (context *SignContext) SignPDF() error { + ctx := cContext.Background() if context.SignData.Signature.CertType == 0 { context.SignData.Signature.CertType = 1 @@ -93,6 +97,7 @@ func (context *SignContext) SignPDF() error { degenerated, err := pkcs7.DegenerateCertificate(context.SignData.Certificate.Raw) if err != nil { + log.Logger.Error(ctx, "failed to degenrate certificate", err, nil) return fmt.Errorf("failed to degenerate certificate: %w", err) } @@ -109,6 +114,7 @@ func (context *SignContext) SignPDF() error { for _, cert := range certificate_chain { degenerated, err := pkcs7.DegenerateCertificate(cert.Raw) if err != nil { + log.Logger.Error(ctx, "failed to degenrate certificate in chain", err, nil) return fmt.Errorf("failed to degenerate certificate in chain: %w", err) } @@ -117,6 +123,7 @@ func (context *SignContext) SignPDF() error { } if err := context.fetchRevocationData(); err != nil { + log.Logger.Error(ctx, "failed to fetch revocation data", err, nil) return fmt.Errorf("failed to fetch revocation data: %w", err) } } @@ -136,12 +143,14 @@ func (context *SignContext) SignPDF() error { context.SignData.objectId, err = context.addObject(signature_object) if err != nil { + log.Logger.Error(ctx, "failed to add signature object", err, nil) return fmt.Errorf("failed to add signature object: %w", err) } visible := false rectangle := [4]float64{0, 0, 0, 0} if context.SignData.Signature.CertType != ApprovalSignature && context.SignData.Appearance.Visible { + log.Logger.Error(ctx, "visible signatures are only allowed for approval signatures", nil, nil) return fmt.Errorf("visible signatures are only allowed for approval signatures") } else if context.SignData.Signature.CertType == ApprovalSignature && context.SignData.Appearance.Visible { visible = true @@ -155,48 +164,58 @@ func (context *SignContext) SignPDF() error { visual_signature, err := context.createVisualSignature(visible, context.SignData.Appearance.Page, rectangle) if err != nil { + log.Logger.Error(ctx, "failed to create visual signature", err, nil) return fmt.Errorf("failed to create visual signature: %w", err) } context.VisualSignData.objectId, err = context.addObject(visual_signature) if err != nil { + log.Logger.Error(ctx, "failed to add visual signature object", err, nil) return fmt.Errorf("failed to add visual signature object: %w", err) } if context.SignData.Appearance.Visible { inc_page_update, err := context.createIncPageUpdate(context.SignData.Appearance.Page, context.VisualSignData.objectId) if err != nil { + log.Logger.Error(ctx, "failed to create incremental page update", err, nil) return fmt.Errorf("failed to create incremental page update: %w", err) } err = context.updateObject(context.VisualSignData.pageObjectId, inc_page_update) if err != nil { + log.Logger.Error(ctx, "failed to add incremental page update object", err, nil) return fmt.Errorf("failed to add incremental page update object: %w", err) } } catalog, err := context.createCatalog() if err != nil { + log.Logger.Error(ctx, "failed to create catalog", err, nil) return fmt.Errorf("failed to create catalog: %w", err) } context.CatalogData.ObjectId, err = context.addObject(catalog) if err != nil { + log.Logger.Error(ctx, "failed to add catalog object", err, nil) return fmt.Errorf("failed to add catalog object: %w", err) } if err := context.writeXref(); err != nil { + log.Logger.Error(ctx, "failed to write xref", err, nil) return fmt.Errorf("failed to write xref: %w", err) } if err := context.writeTrailer(); err != nil { + log.Logger.Error(ctx, "failed to write trailer", err, nil) return fmt.Errorf("failed to write trailer: %w", err) } if err := context.updateByteRange(); err != nil { + log.Logger.Error(ctx, "failed to update byte range", err, nil) return fmt.Errorf("failed to update byte range: %w", err) } if err := context.replaceSignature(); err != nil { + log.Logger.Error(ctx, "failed to replace signature", err, nil) return fmt.Errorf("failed to replace signature: %w", err) } @@ -254,6 +273,7 @@ func SignPdfStream(ctx context.Context, pdfStream io.Reader, cert *x509.Certific var pdfBuffer bytes.Buffer _, err := io.Copy(&pdfBuffer, pdfStream) if err != nil { + log.Logger.Error(ctx, "failed to read pdf stream", err, nil) return nil, fmt.Errorf("failed to read pdf stream: %v", err) } @@ -261,6 +281,7 @@ func SignPdfStream(ctx context.Context, pdfStream io.Reader, cert *x509.Certific pdfReader, err := pdf.NewReader(bytes.NewReader(pdfBytes), int64(len(pdfBytes))) if err != nil { + log.Logger.Error(ctx, "failed to create PDF reader", err, nil) return nil, fmt.Errorf("failed to create PDF reader: %v", err) } @@ -288,6 +309,7 @@ func SignPdfStream(ctx context.Context, pdfStream io.Reader, cert *x509.Certific TSA: TSA{}, }) if err != nil { + log.Logger.Error(ctx, "failed sign PDF", err, nil) return nil, fmt.Errorf("failed to sign PDF: %v", err) } diff --git a/lib/signer/timestamp.go b/lib/signer/timestamp.go index cb109c6..529a067 100644 --- a/lib/signer/timestamp.go +++ b/lib/signer/timestamp.go @@ -8,22 +8,31 @@ import ( "net/http" "strconv" + cContext "context" + + log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/timestamp" ) func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []byte, err error) { + ctx := cContext.Background() + sign_reader := bytes.NewReader(sign_content) ts_request, err := timestamp.CreateRequest(sign_reader, ×tamp.RequestOptions{ Hash: context.SignData.DigestAlgorithm, Certificates: true, }) if err != nil { + log.Logger.Error(ctx, "failed to create request", err, nil) return nil, fmt.Errorf("failed to create request: %w", err) } ts_request_reader := bytes.NewReader(ts_request) req, err := http.NewRequest("POST", context.SignData.TSA.URL, ts_request_reader) if err != nil { + log.Logger.Error(ctx, "failed to prepare request", err, map[string]any{ + "url": context.SignData.TSA.URL, + }) return nil, fmt.Errorf("failed to prepare request (%s): %w", context.SignData.TSA.URL, err) } @@ -47,6 +56,7 @@ func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []by defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { + log.Logger.Error(ctx, "failed to read non success response", err, nil) return nil, fmt.Errorf("failed to read non success response: %w", err) } return nil, errors.New("non success response (" + strconv.Itoa(code) + "): " + string(body)) @@ -58,6 +68,7 @@ func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []by defer resp.Body.Close() timestamp_response_body, err := io.ReadAll(resp.Body) if err != nil { + log.Logger.Error(ctx, "failed to read response", err, nil) return nil, fmt.Errorf("failed to read response: %w", err) } diff --git a/lib/signer/utils.go b/lib/signer/utils.go index ba18b2e..d467347 100644 --- a/lib/signer/utils.go +++ b/lib/signer/utils.go @@ -1,11 +1,13 @@ package signer import ( + "context" "fmt" "math" "strings" "time" + log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/pdf" "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" @@ -108,5 +110,8 @@ func findPageByNumber(pages pdf.Value, targetPageNumber uint32) (pdf.Value, erro } } + log.Logger.Error(context.Background(), "page number not found", nil, map[string]any{ + "page_number": targetPageNumber, + }) return pdf.Value{}, fmt.Errorf("page number %d not found", targetPageNumber) } diff --git a/lib/signer/xref.go b/lib/signer/xref.go index e6f4fb6..cb658b5 100644 --- a/lib/signer/xref.go +++ b/lib/signer/xref.go @@ -9,10 +9,17 @@ import ( "io" "strconv" "strings" + + cContext "context" + + log "github.com/Zomato/espresso/lib/logger" ) func (context *SignContext) writeXref() error { + ctx := cContext.Background() + if _, err := context.OutputBuffer.Write([]byte("\n")); err != nil { + log.Logger.Error(ctx, "failed to write new line before xref", err, nil) return fmt.Errorf("failed to write newline before xref: %w", err) } context.NewXrefStart = int64(context.OutputBuffer.Buff.Len()) @@ -23,6 +30,7 @@ func (context *SignContext) writeXref() error { case "stream": return context.writeXrefStream() default: + log.Logger.Error(ctx, "unknown xref type", nil, map[string]any{"type": context.PDFReader.XrefInformation.Type}) return fmt.Errorf("unknown xref type: %s", context.PDFReader.XrefInformation.Type) } } @@ -30,6 +38,7 @@ func (context *SignContext) writeXref() error { func (context *SignContext) getLastObjectIDFromXref() (uint32, error) { xref := context.PDFReader.Xref() if len(xref) == 0 { + log.Logger.Error(cContext.Background(), "no xref entries found", nil, nil) return 0, fmt.Errorf("no xref entries found") } @@ -46,31 +55,37 @@ func (context *SignContext) getLastObjectIDFromXref() (uint32, error) { } func (context *SignContext) writeIncrXrefTable() error { + ctx := cContext.Background() if _, err := context.OutputBuffer.Write([]byte("xref\n")); err != nil { + log.Logger.Error(ctx, "failed to write incremental xref header", err, nil) return fmt.Errorf("failed to write incremental xref header: %w", err) } for _, entry := range context.updatedXrefEntries { pageXrefObj := fmt.Sprintf("%d %d\n", entry.ID, 1) if _, err := context.OutputBuffer.Write([]byte(pageXrefObj)); err != nil { + log.Logger.Error(ctx, "failed to write updated xref object", err, nil) return fmt.Errorf("failed to write updated xref object: %w", err) } xrefLine := fmt.Sprintf("%010d 00000 n\r\n", entry.Offset) if _, err := context.OutputBuffer.Write([]byte(xrefLine)); err != nil { + log.Logger.Error(ctx, "failed to write updated incremental xref entry", err, nil) return fmt.Errorf("failed to write updated incremental xref entry: %w", err) } } startXrefObj := fmt.Sprintf("%d %d\n", context.lastXrefID+1, len(context.newXrefEntries)) if _, err := context.OutputBuffer.Write([]byte(startXrefObj)); err != nil { + log.Logger.Error(ctx, "failed to write starting xref object", err, nil) return fmt.Errorf("failed to write starting xref object: %w", err) } for _, entry := range context.newXrefEntries { xrefLine := fmt.Sprintf("%010d 00000 n\r\n", entry.Offset) if _, err := context.OutputBuffer.Write([]byte(xrefLine)); err != nil { + log.Logger.Error(ctx, "failed to write incremental xref entry", err, nil) return fmt.Errorf("failed to write incremental xref entry: %w", err) } } @@ -79,6 +94,8 @@ func (context *SignContext) writeIncrXrefTable() error { } func (context *SignContext) writeXrefStream() error { + ctx := cContext.Background() + var buffer bytes.Buffer predictor := context.PDFReader.Trailer().Key("DecodeParms").Key("Predictor").Int64() @@ -87,26 +104,31 @@ func (context *SignContext) writeXrefStream() error { } if err := writeXrefStreamEntries(&buffer, context); err != nil { + log.Logger.Error(ctx, "failed to write xref stream entries", err, nil) return fmt.Errorf("failed to write xref stream entries: %w", err) } streamBytes, err := encodeXrefStream(buffer.Bytes(), predictor) if err != nil { + log.Logger.Error(ctx, "failed to encode xref stream", err, nil) return fmt.Errorf("failed to encode xref stream: %w", err) } var xrefStreamObject bytes.Buffer if err := writeXrefStreamHeader(&xrefStreamObject, context, len(streamBytes)); err != nil { + log.Logger.Error(ctx, "failed to write xref stream header", err, nil) return fmt.Errorf("failed to write xref stream header: %w", err) } if err := writeXrefStreamContent(&xrefStreamObject, streamBytes); err != nil { + log.Logger.Error(ctx, "failed to write xref stream content", err, nil) return fmt.Errorf("failed to write xref stream content: %w", err) } _, err = context.addObject(xrefStreamObject.Bytes()) if err != nil { + log.Logger.Error(ctx, "failed to add xref stream object", err, nil) return fmt.Errorf("failed to add xref stream object: %w", err) } diff --git a/lib/templatestore/diskstore.go b/lib/templatestore/diskstore.go index 85bb203..2511b18 100644 --- a/lib/templatestore/diskstore.go +++ b/lib/templatestore/diskstore.go @@ -7,6 +7,8 @@ import ( "os" "path/filepath" "text/template" + + log "github.com/Zomato/espresso/lib/logger" ) // DiskTemplateStorage is a concrete implementation of TemplateStorageAdapter for disk storage. @@ -16,12 +18,14 @@ type DiskTemplateStorage struct { func (d *DiskTemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateRequest) (*template.Template, error) { if req.TemplatePath == "" { + log.Logger.Error(ctx, "template path is required for disk storage", nil, nil) return nil, fmt.Errorf("template path is required for disk storage") } // get template from filepath templatePath := req.TemplatePath templateFile, err := template.ParseFiles(templatePath) if err != nil { + log.Logger.Error(ctx, "unable to parse template file", err, nil) return nil, fmt.Errorf("unable to parse template file: %v", err) } @@ -31,6 +35,7 @@ func (d *DiskTemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateR func (d *DiskTemplateStorage) PutDocument(ctx context.Context, req *PostDocumentRequest, reader *io.Reader) (string, error) { if req.FilePath == "" { + log.Logger.Error(ctx, "file path is required for disk storage", nil, nil) return "", fmt.Errorf("file path is required for disk storage") } // Create directories if they don't exist @@ -38,18 +43,21 @@ func (d *DiskTemplateStorage) PutDocument(ctx context.Context, req *PostDocument // make directory from req.filepath, dont append output err := os.MkdirAll(dir, 0755) if err != nil { + log.Logger.Error(ctx, "failed to create directory", err, nil) return "", fmt.Errorf("failed to create directory: %v", err) } // Create the file file, err := os.Create(req.FilePath) if err != nil { + log.Logger.Error(ctx, "failed to create file", err, nil) return "", fmt.Errorf("failed to create file: %v", err) } defer file.Close() // Copy the stream to the file if _, err := io.Copy(file, *reader); err != nil { + log.Logger.Error(ctx, "failed to write file", err, nil) return "", fmt.Errorf("failed to write file: %v", err) } @@ -57,11 +65,13 @@ func (d *DiskTemplateStorage) PutDocument(ctx context.Context, req *PostDocument } func (d *DiskTemplateStorage) GetDocument(ctx context.Context, req *GetDocumentRequest) (io.Reader, error) { if req.FilePath == "" { + log.Logger.Error(ctx, "file path is required for disk storage", nil, nil) return nil, fmt.Errorf("file path is required for disk storage") } // Open the file for reading file, err := os.Open(req.FilePath) if err != nil { + log.Logger.Error(ctx, "failed to open file", err, nil) return nil, fmt.Errorf("failed to open file: %v", err) } diff --git a/lib/templatestore/mysqlstore.go b/lib/templatestore/mysqlstore.go index b79d9d6..7df0fcf 100644 --- a/lib/templatestore/mysqlstore.go +++ b/lib/templatestore/mysqlstore.go @@ -7,6 +7,7 @@ import ( "io" "text/template" + log "github.com/Zomato/espresso/lib/logger" _ "github.com/go-sql-driver/mysql" "github.com/google/uuid" ) @@ -208,7 +209,7 @@ func (m *MySQLTemplateStorage) CreateTemplate(ctx context.Context, req *CreateTe } if count > 0 { - fmt.Println("template ID already exists: ", templateID) + log.Logger.Info(ctx, "template ID already exists: ", map[string]any{"id": templateID}) return "", fmt.Errorf("server error, failed at id generation") } diff --git a/lib/templatestore/s3store.go b/lib/templatestore/s3store.go index a6dfd72..67cc7da 100644 --- a/lib/templatestore/s3store.go +++ b/lib/templatestore/s3store.go @@ -6,6 +6,7 @@ import ( "io" "text/template" + log "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/s3" ) @@ -23,6 +24,7 @@ func NewS3StorageAdapter(ctx context.Context, options ...func(*s3.Config)) (*S3T func (s *S3TemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateRequest) (*template.Template, error) { if req.TemplateS3Path == "" { + log.Logger.Error(ctx, "template path is required for S3 storage", nil, nil) return nil, fmt.Errorf("template path is required for S3 storage") } reader, err := s.client.GetFileReader(ctx, req.TemplateS3Path) @@ -38,11 +40,13 @@ func (s *S3TemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateReq func (s *S3TemplateStorage) PutDocument(ctx context.Context, req *PostDocumentRequest, reader *io.Reader) (string, error) { if req.FileS3Path == "" { + log.Logger.Error(ctx, "file S3 path is required for S3 storage", nil, nil) return "", fmt.Errorf("file S3 path is required for S3 storage") } // Upload the file to S3 _, err := s.client.UploadFile(ctx, req.FileS3Path, *reader) if err != nil { + log.Logger.Error(ctx, "failed to upload file to S3", nil, nil) return "", fmt.Errorf("failed to upload file to S3: %v", err) } @@ -50,6 +54,7 @@ func (s *S3TemplateStorage) PutDocument(ctx context.Context, req *PostDocumentRe } func (s *S3TemplateStorage) GetDocument(ctx context.Context, req *GetDocumentRequest) (io.Reader, error) { if req.FileS3Path == "" { + log.Logger.Error(ctx, "file S3 path is required for S3", nil, nil) return nil, fmt.Errorf("file S3 path is required for S3 storage") } return s.client.GetFileReader(ctx, req.FileS3Path) diff --git a/lib/templatestore/streamstore.go b/lib/templatestore/streamstore.go index 9979b76..2995c13 100644 --- a/lib/templatestore/streamstore.go +++ b/lib/templatestore/streamstore.go @@ -6,6 +6,8 @@ import ( "fmt" "io" "text/template" + + log "github.com/Zomato/espresso/lib/logger" ) type StreamStorage struct { @@ -13,6 +15,7 @@ type StreamStorage struct { func (s *StreamStorage) GetTemplate(ctx context.Context, req *GetTemplateRequest) (*template.Template, error) { if req.TemplateBytes == nil { + log.Logger.Error(ctx, "input template stream is required for strem storage", nil, nil) return nil, fmt.Errorf("input template stream is required for stream storage") } @@ -22,6 +25,7 @@ func (s *StreamStorage) PutDocument(ctx context.Context, req *PostDocumentReques // Read all bytes from the rod.StreamReader pdfBytes, err := io.ReadAll(*reader) if err != nil { + log.Logger.Error(ctx, "failed to read PDF stream", err, nil) return "", fmt.Errorf("failed to read PDF stream: %v", err) } @@ -31,6 +35,7 @@ func (s *StreamStorage) PutDocument(ctx context.Context, req *PostDocumentReques } func (s *StreamStorage) GetDocument(ctx context.Context, req *GetDocumentRequest) (io.Reader, error) { if req.InputFileBytes == nil { + log.Logger.Error(ctx, "input file bytes are required for stream storage", nil, nil) return nil, fmt.Errorf("input file bytes are required for stream storage") } diff --git a/lib/workerpool/pool.go b/lib/workerpool/pool.go index 594e172..7d7fe63 100644 --- a/lib/workerpool/pool.go +++ b/lib/workerpool/pool.go @@ -1,9 +1,10 @@ package workerpool import ( - "fmt" + "context" "time" + log "github.com/Zomato/espresso/lib/logger" "github.com/panjf2000/ants/v2" ) @@ -30,7 +31,8 @@ func Initialize(size int, expiryDuration time.Duration) { ants.WithExpiryDuration(expiryDuration), ) if err != nil { - fmt.Printf("could not initialize worker pool: %v\n", err) + log.Logger.Error(context.Background(), "could not initialize worker pool", err, nil) + panic(err) } pool = &WorkerPool{Pool: workerPool} From e771b3d6400c8b80f7b0761b6c49ea72c28ecc4b Mon Sep 17 00:00:00 2001 From: Sushant Date: Fri, 4 Apr 2025 08:44:57 +0530 Subject: [PATCH 06/13] logger comments --- lib/logger/logger.go | 6 ++++-- lib/logger/no-op.go | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/logger/logger.go b/lib/logger/logger.go index c500c6f..5ce7e02 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -6,7 +6,9 @@ import ( ) var ( - once sync.Once + once sync.Once + + // Assigning default no-op logger. Later it will be replaced by actual logger(if provided) inside init function. Logger ILogger = newNoOpLogger() ) @@ -29,7 +31,7 @@ type ILogger interface { } func init() { - // Choose which logger to use. + // Replace with ILogger implementation to use logger of your choice. once.Do(func() { zeroLog := newZeroLog() diff --git a/lib/logger/no-op.go b/lib/logger/no-op.go index 7d0900a..d521480 100644 --- a/lib/logger/no-op.go +++ b/lib/logger/no-op.go @@ -1,3 +1,7 @@ +/* + Default no operation logger for no overhead. It is assigned default to ILogger instance in logger.go file. +*/ + package log import ( From b0f8f60eedca0a2a68e8a223fb5db24471fa25e0 Mon Sep 17 00:00:00 2001 From: Sushant Date: Sat, 5 Apr 2025 08:52:44 +0530 Subject: [PATCH 07/13] removed error logs from lib --- lib/browser_manager/initialize.go | 12 +++--------- lib/browser_manager/tabManager.go | 4 +--- lib/certmanager/certmanager.go | 24 ------------------------ lib/renderer/parser.go | 4 ---- lib/renderer/pdf.go | 11 ----------- lib/renderer/prefetchImages.go | 4 ---- lib/signer/appearance.go | 12 ------------ lib/signer/object.go | 12 ------------ lib/signer/signature.go | 14 -------------- lib/signer/signer.go | 23 ----------------------- lib/signer/timestamp.go | 10 ---------- lib/signer/utils.go | 5 ----- lib/signer/xref.go | 20 -------------------- lib/templatestore/diskstore.go | 10 ---------- lib/templatestore/s3store.go | 5 ----- lib/templatestore/streamstore.go | 5 ----- lib/workerpool/pool.go | 3 --- 17 files changed, 4 insertions(+), 174 deletions(-) diff --git a/lib/browser_manager/initialize.go b/lib/browser_manager/initialize.go index 4e1604c..bec111e 100644 --- a/lib/browser_manager/initialize.go +++ b/lib/browser_manager/initialize.go @@ -19,9 +19,7 @@ func Init(ctx context.Context, tabPool int) error { browserPath := os.Getenv("ROD_BROWSER_BIN") if browserPath == "" { - err := fmt.Errorf("ROD_BROWSER_BIN environment variable not set") - log.Logger.Error(ctx, "ENV Missing", err, nil) - return err + return fmt.Errorf("ROD_BROWSER_BIN environment variable not set") } launcher := launcher.New().Bin(browserPath). @@ -76,17 +74,13 @@ func Init(ctx context.Context, tabPool int) error { url, err := launcher.Launch() if err != nil { - err := fmt.Errorf("failed to launch browser: %v", err) - log.Logger.Error(ctx, "", err, nil) - return err + return fmt.Errorf("failed to launch browser: %v", err) } fmt.Printf("Browser launched at URL: %s\n", url) browser := rod.New().ControlURL(url) if err := browser.Connect(); err != nil { - err := fmt.Errorf("failed to connect to browser: %v", err) - log.Logger.Error(ctx, "", err, nil) - return err + return fmt.Errorf("failed to connect to browser: %v", err) } Browser = browser diff --git a/lib/browser_manager/tabManager.go b/lib/browser_manager/tabManager.go index 6856aea..18b33f4 100644 --- a/lib/browser_manager/tabManager.go +++ b/lib/browser_manager/tabManager.go @@ -94,9 +94,7 @@ func removeBlobURL(page *rod.Page, blobURL string) error { }`, blobURL) if err != nil { - err := fmt.Errorf("failed to execute JavaScript for blob URL: %v", err) - log.Logger.Error(context.Background(), "JS Execution Failed", err, nil) - return err + return fmt.Errorf("failed to execute JavaScript for blob URL: %v", err) } return nil diff --git a/lib/certmanager/certmanager.go b/lib/certmanager/certmanager.go index 6cdc73c..df726ef 100644 --- a/lib/certmanager/certmanager.go +++ b/lib/certmanager/certmanager.go @@ -11,8 +11,6 @@ import ( "fmt" "os" "os/exec" - - log "github.com/Zomato/espresso/lib/logger" ) // SigningCredentials holds the certificate and private key for PDF signing @@ -31,13 +29,11 @@ func LoadSigningCredentials(ctx context.Context, certConfig *CertificateConfig) cert, err := getCertificate(certConfig.CertFilePath) if err != nil { - log.Logger.Error(ctx, "failed to get certificate", err, nil) return nil, fmt.Errorf("failed to get certificate: %v", err) } privateKey, err := getKey(certConfig.KeyFilePath, certConfig.KeyPassword) if err != nil { - log.Logger.Error(ctx, "failed to get certificate", err, nil) return nil, fmt.Errorf("failed to get private key: %v", err) } @@ -48,40 +44,31 @@ func LoadSigningCredentials(ctx context.Context, certConfig *CertificateConfig) } func getCertificate(certPath string) (*x509.Certificate, error) { - ctx := context.Background() - certBytes, err := os.ReadFile(certPath) if err != nil { - log.Logger.Error(ctx, "failed to read certificate file", err, nil) return nil, fmt.Errorf("failed to read certificate file: %v", err) } certBlock, _ := pem.Decode(certBytes) if certBlock == nil { - log.Logger.Error(ctx, "failed to decode certificate PEN", nil, nil) return nil, fmt.Errorf("failed to decode certificate PEM") } cert, err := x509.ParseCertificate(certBlock.Bytes) if err != nil { - log.Logger.Error(ctx, "failed to parse certificate", err, nil) return nil, fmt.Errorf("failed to parse certificate: %v", err) } return cert, nil } func getKey(keyPath, password string) (crypto.Signer, error) { - ctx := context.Background() - keyBytes, err := os.ReadFile(keyPath) if err != nil { - log.Logger.Error(ctx, "failed to read private key file", err, nil) return nil, fmt.Errorf("failed to read private key file: %v", err) } privateKey, err := loadPrivateKey(keyBytes, password) if err != nil { - log.Logger.Error(ctx, "failed to load private key", err, nil) return nil, fmt.Errorf("failed to load private key: %v", err) } @@ -89,11 +76,8 @@ func getKey(keyPath, password string) (crypto.Signer, error) { } func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { - ctx := context.Background() - block, _ := pem.Decode(keyBytes) if block == nil { - log.Logger.Error(ctx, "failed to decode PEM block", nil, nil) return nil, fmt.Errorf("failed to decode PEM block") } @@ -101,7 +85,6 @@ func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { // For PKCS#8 encrypted keys key, err := parseEncryptedPKCS8PrivateKey(block.Bytes, []byte(password)) if err != nil { - log.Logger.Error(ctx, "failed to parse encrypted PKCS#8 private key", err, nil) return nil, fmt.Errorf("failed to parse encrypted PKCS#8 private key: %w", err) } @@ -111,14 +94,12 @@ func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { case *ecdsa.PrivateKey: return k, nil default: - log.Logger.Error(ctx, "unsupported private key type", nil, nil) return nil, fmt.Errorf("unsupported private key type") } } else if block.Type == "PRIVATE KEY" { // For unencrypted PKCS#8 keys key, err := x509.ParsePKCS8PrivateKey(block.Bytes) if err != nil { - log.Logger.Error(ctx, "failed to parse PKCS#8 private key", err, nil) return nil, fmt.Errorf("failed to parse PKCS#8 private key: %w", err) } @@ -128,18 +109,15 @@ func loadPrivateKey(keyBytes []byte, password string) (crypto.Signer, error) { case *ecdsa.PrivateKey: return k, nil default: - log.Logger.Error(ctx, "unsupported private key type", nil, nil) return nil, fmt.Errorf("unsupported private key type") } } else { - log.Logger.Error(ctx, "unsupported private key format", nil, map[string]any{"key_type": block.Type}) return nil, fmt.Errorf("unsupported private key format: %s", block.Type) } } // Helper function to parse PKCS#8 encrypted private keys func parseEncryptedPKCS8PrivateKey(data, password []byte) (interface{}, error) { - ctx := context.Background() var privKey interface{} // First try direct parsing (for some implementations) @@ -177,7 +155,6 @@ func parseEncryptedPKCS8PrivateKey(data, password []byte) (interface{}, error) { cmd.Stderr = &stderr if err := cmd.Run(); err != nil { - log.Logger.Error(ctx, "OpenSSL error", err, nil) return nil, fmt.Errorf("OpenSSL error: %v, %s", err, stderr.String()) } @@ -189,7 +166,6 @@ func parseEncryptedPKCS8PrivateKey(data, password []byte) (interface{}, error) { decryptedBlock, _ := pem.Decode(decryptedData) if decryptedBlock == nil { - log.Logger.Error(ctx, "failed to decode decrypted PEM block", nil, nil) return nil, fmt.Errorf("failed to decode decrypted PEM block") } diff --git a/lib/renderer/parser.go b/lib/renderer/parser.go index 4f41867..fb0c418 100644 --- a/lib/renderer/parser.go +++ b/lib/renderer/parser.go @@ -7,8 +7,6 @@ import ( "strings" "sync" "text/template" - - log "github.com/Zomato/espresso/lib/logger" ) var bufferPool = sync.Pool{ @@ -21,7 +19,6 @@ func ExecuteTemplate(ctx context.Context, templateFile *template.Template, data // Validate template and data if templateFile == nil { - log.Logger.Error(ctx, "template file is nil", nil, nil) return "", fmt.Errorf("template file is nil") } @@ -32,7 +29,6 @@ func ExecuteTemplate(ctx context.Context, templateFile *template.Template, data // Execute template with buffered writer if err := templateFile.Execute(buf, data); err != nil { - log.Logger.Error(ctx, "failed to execute template", err, nil) return "", fmt.Errorf("failed to execute template: %w", err) } diff --git a/lib/renderer/pdf.go b/lib/renderer/pdf.go index 6dbc97f..2d5421b 100644 --- a/lib/renderer/pdf.go +++ b/lib/renderer/pdf.go @@ -17,7 +17,6 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp startTime := time.Now() if params == nil { - log.Logger.Error(ctx, "params are required", nil, nil) return nil, fmt.Errorf("params are required") } @@ -30,18 +29,15 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp if storeAdapter != nil { templateFile, err = (*storeAdapter).GetTemplate(ctx, ¶ms.TemplateRequest) if err != nil { - log.Logger.Error(ctx, "unable to get template file from store", err, nil) return nil, fmt.Errorf("unable to get template file from store: %v", err) } } else { if len(params.TemplateRequest.TemplateBytes) > 0 { templateFile, err = template.New("stream").Parse(string(params.TemplateRequest.TemplateBytes)) if err != nil { - log.Logger.Error(ctx, "unable to parse template file", err, nil) return nil, fmt.Errorf("unable to parse template file: %v", err) } } else { - log.Logger.Error(ctx, "storage configuration is invalid", nil, nil) return nil, fmt.Errorf("storage configuration is invalid") } } @@ -53,7 +49,6 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp var unmarshaledData map[string]interface{} if err := json.Unmarshal(data, &unmarshaledData); err != nil { - log.Logger.Error(ctx, "unable to unmarshal JSON data", err, nil) return nil, fmt.Errorf("unable to unmarshal JSON data: %v", err) } @@ -78,7 +73,6 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp htmlContent, err := ExecuteTemplate(ctx, templateFile, unmarshaledData) if err != nil { - log.Logger.Error(ctx, "unable to execute template file", err, nil) return nil, fmt.Errorf("unable to execute template file: %v", err) } @@ -99,7 +93,6 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp err = page.SetDocumentContent(string(htmlContent)) if err != nil { - log.Logger.Error(ctx, "unable to generate pdf", err, nil) return nil, fmt.Errorf("unable to generate pdf: %v", err) } @@ -109,19 +102,16 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp err = page.WaitLoad() if err != nil { - log.Logger.Error(ctx, "error in waiting for page load", err, nil) return nil, fmt.Errorf("error in waiting for page load: %v", err) } body, err := page.Element("html") if err != nil { - log.Logger.Error(ctx, "error in getting html element", err, nil) return nil, fmt.Errorf("error in getting html element: %v", err) } heightProp, err := body.Property("scrollHeight") if err != nil { - log.Logger.Error(ctx, "error in getting scroll height", err, nil) return nil, fmt.Errorf("error in getting scroll height: %v", err) } @@ -137,7 +127,6 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp pdfStream, err := page.PDF(pdfParams) if err != nil { - log.Logger.Error(ctx, "unable to generate pdf", err, nil) return nil, fmt.Errorf("unable to generate pdf: %v", err) } diff --git a/lib/renderer/prefetchImages.go b/lib/renderer/prefetchImages.go index d07419c..d99f78c 100644 --- a/lib/renderer/prefetchImages.go +++ b/lib/renderer/prefetchImages.go @@ -111,14 +111,12 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string // Fetch an image and convert it to a data URI func fetchImageAsDataURIFromURL(url string) (string, error) { startTime := time.Now() - ctx := context.Background() duration := time.Since(startTime) log.Logger.Info(context.Background(), "fetching image at", map[string]any{"time": duration, "url": url}) resp, err := http.Get(url) if err != nil { - log.Logger.Error(ctx, "failed to fetch image", err, nil) return "", fmt.Errorf("failed to fetch image: %v", err) } @@ -128,13 +126,11 @@ func fetchImageAsDataURIFromURL(url string) (string, error) { defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - log.Logger.Error(ctx, "failed to fetch image", nil, map[string]any{"status_code": resp.StatusCode}) return "", fmt.Errorf("failed to fetch image, status code: %d", resp.StatusCode) } imageBytes, err := io.ReadAll(resp.Body) if err != nil { - log.Logger.Error(ctx, "failed to read image bytes", err, nil) return "", fmt.Errorf("failed to read image bytes: %v", err) } diff --git a/lib/signer/appearance.go b/lib/signer/appearance.go index d48b38e..5b593b0 100644 --- a/lib/signer/appearance.go +++ b/lib/signer/appearance.go @@ -2,16 +2,11 @@ package signer import ( "bytes" - cContext "context" "fmt" "strconv" - - log "github.com/Zomato/espresso/lib/logger" ) func (context *SignContext) createVisualSignature(visible bool, pageNumber uint32, rect [4]float64) ([]byte, error) { - ctx := cContext.Background() - var visual_signature bytes.Buffer visual_signature.WriteString("<<\n") @@ -26,13 +21,11 @@ func (context *SignContext) createVisualSignature(visible bool, pageNumber uint3 appearance, err := context.createAppearance(rect) if err != nil { - log.Logger.Error(ctx, "failed to create appearance", err, nil) return nil, fmt.Errorf("failed to create appearance: %w", err) } appearanceObjectId, err := context.addObject(appearance) if err != nil { - log.Logger.Error(ctx, "failed to add appearance object", err, nil) return nil, fmt.Errorf("failed to add appearance object: %w", err) } @@ -126,7 +119,6 @@ func (context *SignContext) createIncPageUpdate(pageNumber, annot uint32) ([]byt } func (context *SignContext) createAppearance(rect [4]float64) ([]byte, error) { - ctx := cContext.Background() text := context.SignData.Signature.Info.Name @@ -134,10 +126,6 @@ func (context *SignContext) createAppearance(rect [4]float64) ([]byte, error) { rectHeight := rect[3] - rect[1] if rectWidth < 1 || rectHeight < 1 { - log.Logger.Error(ctx, "inavlid rectangl dimensions", nil, map[string]any{ - "width": rectWidth, - "height": rectHeight, - }) return nil, fmt.Errorf("invalid rectangle dimensions: width %.2f and height %.2f must be greater than 0", rectWidth, rectHeight) } diff --git a/lib/signer/object.go b/lib/signer/object.go index 34e2c23..8bca7d3 100644 --- a/lib/signer/object.go +++ b/lib/signer/object.go @@ -3,19 +3,13 @@ package signer import ( "bytes" "fmt" - - cContext "context" - - log "github.com/Zomato/espresso/lib/logger" ) func (context *SignContext) addObject(object []byte) (uint32, error) { - ctx := cContext.Background() if context.lastXrefID == 0 { lastXrefID, err := context.getLastObjectIDFromXref() if err != nil { - log.Logger.Error(ctx, "failed to get last object ID", err, nil) return 0, fmt.Errorf("failed to get last object ID: %w", err) } context.lastXrefID = lastXrefID @@ -29,7 +23,6 @@ func (context *SignContext) addObject(object []byte) (uint32, error) { err := context.writeObject(objectID, object) if err != nil { - log.Logger.Error(ctx, "failed to write object", err, nil) return 0, fmt.Errorf("failed to write object: %w", err) } @@ -44,7 +37,6 @@ func (context *SignContext) updateObject(id uint32, object []byte) error { err := context.writeObject(id, object) if err != nil { - log.Logger.Error(cContext.Background(), "failed to write object", err, nil) return fmt.Errorf("failed to write object: %w", err) } @@ -52,21 +44,17 @@ func (context *SignContext) updateObject(id uint32, object []byte) error { } func (context *SignContext) writeObject(id uint32, object []byte) error { - ctx := cContext.Background() if _, err := context.OutputBuffer.Write([]byte(fmt.Sprintf("\n%d 0 obj\n", id))); err != nil { - log.Logger.Error(ctx, "failed to write object header", err, nil) return fmt.Errorf("failed to write object header: %w", err) } object = bytes.TrimSpace(object) if _, err := context.OutputBuffer.Write(object); err != nil { - log.Logger.Error(ctx, "failed to write object content", err, nil) return fmt.Errorf("failed to write object content: %w", err) } if _, err := context.OutputBuffer.Write([]byte(objectFooter)); err != nil { - log.Logger.Error(ctx, "failed to write object footer", err, nil) return fmt.Errorf("failed to write object footer: %w", err) } diff --git a/lib/signer/signature.go b/lib/signer/signature.go index a2c46d1..08bb69d 100644 --- a/lib/signer/signature.go +++ b/lib/signer/signature.go @@ -157,7 +157,6 @@ func (context *SignContext) createTimestampPlaceholder() []byte { } func (context *SignContext) createSignature() ([]byte, error) { - ctx := cContext.Background() if _, err := context.OutputBuffer.Seek(0, 0); err != nil { return nil, err @@ -173,13 +172,11 @@ func (context *SignContext) createSignature() ([]byte, error) { timestamp_response, err := context.GetTSA(sign_content) if err != nil { - log.Logger.Error(ctx, "get timestamp", err, nil) return nil, fmt.Errorf("get timestamp: %w", err) } ts, err := timestamp.ParseResponse(timestamp_response) if err != nil { - log.Logger.Error(ctx, "parse timestamp", err, nil) return nil, fmt.Errorf("parse timestamp: %w", err) } @@ -188,14 +185,12 @@ func (context *SignContext) createSignature() ([]byte, error) { signed_data, err := pkcs7.NewSignedData(sign_content) if err != nil { - log.Logger.Error(ctx, "new signed data", err, nil) return nil, fmt.Errorf("new signed data: %w", err) } signed_data.SetDigestAlgorithm(getOIDFromHashAlgorithm(context.SignData.DigestAlgorithm)) signingCertificate, err := context.createSigningCertificateAttribute() if err != nil { - log.Logger.Error(ctx, "new signed data", err, nil) return nil, fmt.Errorf("new signed data: %w", err) } @@ -215,7 +210,6 @@ func (context *SignContext) createSignature() ([]byte, error) { } if err := signed_data.AddSignerChain(context.SignData.Certificate, context.SignData.Signer, certificate_chain, signer_config); err != nil { - log.Logger.Error(ctx, "added signer chain", err, nil) return nil, fmt.Errorf("add signer chain: %w", err) } @@ -226,19 +220,16 @@ func (context *SignContext) createSignature() ([]byte, error) { timestamp_response, err := context.GetTSA(signature_data.SignerInfos[0].EncryptedDigest) if err != nil { - log.Logger.Error(ctx, "get timestamp", err, nil) return nil, fmt.Errorf("get timestamp: %w", err) } ts, err := timestamp.ParseResponse(timestamp_response) if err != nil { - log.Logger.Error(ctx, "parse timestamp", err, nil) return nil, fmt.Errorf("parse timestamp: %w", err) } _, err = pkcs7.Parse(ts.RawToken) if err != nil { - log.Logger.Error(ctx, "parse timestamp token", err, nil) return nil, fmt.Errorf("parse timestamp token: %w", err) } @@ -288,7 +279,6 @@ func (context *SignContext) createSigningCertificateAttribute() (*pkcs7.Attribut } func (context *SignContext) updateByteRange() error { - ctx := cContext.Background() if _, err := context.OutputBuffer.Seek(0, 0); err != nil { return err @@ -297,7 +287,6 @@ func (context *SignContext) updateByteRange() error { contentsPlaceholder := bytes.Repeat([]byte("0"), int(context.SignatureMaxLength)) contentsIndex := bytes.Index(context.OutputBuffer.Buff.Bytes(), contentsPlaceholder) if contentsIndex == -1 { - log.Logger.Error(ctx, "failed to find contents placeholder", nil, nil) return fmt.Errorf("failed to find contents placeholder") } @@ -315,13 +304,11 @@ func (context *SignContext) updateByteRange() error { if len(new_byte_range) < len(signatureByteRangePlaceholder) { new_byte_range += strings.Repeat(" ", len(signatureByteRangePlaceholder)-len(new_byte_range)) } else if len(new_byte_range) != len(signatureByteRangePlaceholder) { - log.Logger.Error(ctx, "new byte range string is the same length as the placeholder", nil, nil) return fmt.Errorf("new byte range string is the same lenght as the placeholder") } placeholderIndex := bytes.Index(context.OutputBuffer.Buff.Bytes(), []byte(signatureByteRangePlaceholder)) if placeholderIndex == -1 { - log.Logger.Error(ctx, "failed to find ByteRange placeholder", nil, nil) return fmt.Errorf("failed to find ByteRange placeholder") } @@ -340,7 +327,6 @@ func (context *SignContext) replaceSignature() error { signature, err := context.createSignature() if err != nil { - log.Logger.Error(cContext.Background(), "failed to create signature", err, nil) return fmt.Errorf("failed to create signature: %w", err) } diff --git a/lib/signer/signer.go b/lib/signer/signer.go index e0f4b16..02934f3 100644 --- a/lib/signer/signer.go +++ b/lib/signer/signer.go @@ -10,12 +10,9 @@ import ( "io" "time" - log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/pdf" "github.com/digitorus/pkcs7" "github.com/mattetti/filebuffer" - - cContext "context" ) func Sign(input io.ReadSeeker, output io.Writer, rdr *pdf.Reader, size int64, sign_data SignData) error { @@ -44,8 +41,6 @@ func Sign(input io.ReadSeeker, output io.Writer, rdr *pdf.Reader, size int64, si } func (context *SignContext) SignPDF() error { - ctx := cContext.Background() - if context.SignData.Signature.CertType == 0 { context.SignData.Signature.CertType = 1 } @@ -97,7 +92,6 @@ func (context *SignContext) SignPDF() error { degenerated, err := pkcs7.DegenerateCertificate(context.SignData.Certificate.Raw) if err != nil { - log.Logger.Error(ctx, "failed to degenrate certificate", err, nil) return fmt.Errorf("failed to degenerate certificate: %w", err) } @@ -114,7 +108,6 @@ func (context *SignContext) SignPDF() error { for _, cert := range certificate_chain { degenerated, err := pkcs7.DegenerateCertificate(cert.Raw) if err != nil { - log.Logger.Error(ctx, "failed to degenrate certificate in chain", err, nil) return fmt.Errorf("failed to degenerate certificate in chain: %w", err) } @@ -123,7 +116,6 @@ func (context *SignContext) SignPDF() error { } if err := context.fetchRevocationData(); err != nil { - log.Logger.Error(ctx, "failed to fetch revocation data", err, nil) return fmt.Errorf("failed to fetch revocation data: %w", err) } } @@ -143,14 +135,12 @@ func (context *SignContext) SignPDF() error { context.SignData.objectId, err = context.addObject(signature_object) if err != nil { - log.Logger.Error(ctx, "failed to add signature object", err, nil) return fmt.Errorf("failed to add signature object: %w", err) } visible := false rectangle := [4]float64{0, 0, 0, 0} if context.SignData.Signature.CertType != ApprovalSignature && context.SignData.Appearance.Visible { - log.Logger.Error(ctx, "visible signatures are only allowed for approval signatures", nil, nil) return fmt.Errorf("visible signatures are only allowed for approval signatures") } else if context.SignData.Signature.CertType == ApprovalSignature && context.SignData.Appearance.Visible { visible = true @@ -164,58 +154,48 @@ func (context *SignContext) SignPDF() error { visual_signature, err := context.createVisualSignature(visible, context.SignData.Appearance.Page, rectangle) if err != nil { - log.Logger.Error(ctx, "failed to create visual signature", err, nil) return fmt.Errorf("failed to create visual signature: %w", err) } context.VisualSignData.objectId, err = context.addObject(visual_signature) if err != nil { - log.Logger.Error(ctx, "failed to add visual signature object", err, nil) return fmt.Errorf("failed to add visual signature object: %w", err) } if context.SignData.Appearance.Visible { inc_page_update, err := context.createIncPageUpdate(context.SignData.Appearance.Page, context.VisualSignData.objectId) if err != nil { - log.Logger.Error(ctx, "failed to create incremental page update", err, nil) return fmt.Errorf("failed to create incremental page update: %w", err) } err = context.updateObject(context.VisualSignData.pageObjectId, inc_page_update) if err != nil { - log.Logger.Error(ctx, "failed to add incremental page update object", err, nil) return fmt.Errorf("failed to add incremental page update object: %w", err) } } catalog, err := context.createCatalog() if err != nil { - log.Logger.Error(ctx, "failed to create catalog", err, nil) return fmt.Errorf("failed to create catalog: %w", err) } context.CatalogData.ObjectId, err = context.addObject(catalog) if err != nil { - log.Logger.Error(ctx, "failed to add catalog object", err, nil) return fmt.Errorf("failed to add catalog object: %w", err) } if err := context.writeXref(); err != nil { - log.Logger.Error(ctx, "failed to write xref", err, nil) return fmt.Errorf("failed to write xref: %w", err) } if err := context.writeTrailer(); err != nil { - log.Logger.Error(ctx, "failed to write trailer", err, nil) return fmt.Errorf("failed to write trailer: %w", err) } if err := context.updateByteRange(); err != nil { - log.Logger.Error(ctx, "failed to update byte range", err, nil) return fmt.Errorf("failed to update byte range: %w", err) } if err := context.replaceSignature(); err != nil { - log.Logger.Error(ctx, "failed to replace signature", err, nil) return fmt.Errorf("failed to replace signature: %w", err) } @@ -273,7 +253,6 @@ func SignPdfStream(ctx context.Context, pdfStream io.Reader, cert *x509.Certific var pdfBuffer bytes.Buffer _, err := io.Copy(&pdfBuffer, pdfStream) if err != nil { - log.Logger.Error(ctx, "failed to read pdf stream", err, nil) return nil, fmt.Errorf("failed to read pdf stream: %v", err) } @@ -281,7 +260,6 @@ func SignPdfStream(ctx context.Context, pdfStream io.Reader, cert *x509.Certific pdfReader, err := pdf.NewReader(bytes.NewReader(pdfBytes), int64(len(pdfBytes))) if err != nil { - log.Logger.Error(ctx, "failed to create PDF reader", err, nil) return nil, fmt.Errorf("failed to create PDF reader: %v", err) } @@ -309,7 +287,6 @@ func SignPdfStream(ctx context.Context, pdfStream io.Reader, cert *x509.Certific TSA: TSA{}, }) if err != nil { - log.Logger.Error(ctx, "failed sign PDF", err, nil) return nil, fmt.Errorf("failed to sign PDF: %v", err) } diff --git a/lib/signer/timestamp.go b/lib/signer/timestamp.go index 529a067..b6639f4 100644 --- a/lib/signer/timestamp.go +++ b/lib/signer/timestamp.go @@ -8,14 +8,10 @@ import ( "net/http" "strconv" - cContext "context" - - log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/timestamp" ) func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []byte, err error) { - ctx := cContext.Background() sign_reader := bytes.NewReader(sign_content) ts_request, err := timestamp.CreateRequest(sign_reader, ×tamp.RequestOptions{ @@ -23,16 +19,12 @@ func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []by Certificates: true, }) if err != nil { - log.Logger.Error(ctx, "failed to create request", err, nil) return nil, fmt.Errorf("failed to create request: %w", err) } ts_request_reader := bytes.NewReader(ts_request) req, err := http.NewRequest("POST", context.SignData.TSA.URL, ts_request_reader) if err != nil { - log.Logger.Error(ctx, "failed to prepare request", err, map[string]any{ - "url": context.SignData.TSA.URL, - }) return nil, fmt.Errorf("failed to prepare request (%s): %w", context.SignData.TSA.URL, err) } @@ -56,7 +48,6 @@ func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []by defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { - log.Logger.Error(ctx, "failed to read non success response", err, nil) return nil, fmt.Errorf("failed to read non success response: %w", err) } return nil, errors.New("non success response (" + strconv.Itoa(code) + "): " + string(body)) @@ -68,7 +59,6 @@ func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []by defer resp.Body.Close() timestamp_response_body, err := io.ReadAll(resp.Body) if err != nil { - log.Logger.Error(ctx, "failed to read response", err, nil) return nil, fmt.Errorf("failed to read response: %w", err) } diff --git a/lib/signer/utils.go b/lib/signer/utils.go index d467347..ba18b2e 100644 --- a/lib/signer/utils.go +++ b/lib/signer/utils.go @@ -1,13 +1,11 @@ package signer import ( - "context" "fmt" "math" "strings" "time" - log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/pdf" "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" @@ -110,8 +108,5 @@ func findPageByNumber(pages pdf.Value, targetPageNumber uint32) (pdf.Value, erro } } - log.Logger.Error(context.Background(), "page number not found", nil, map[string]any{ - "page_number": targetPageNumber, - }) return pdf.Value{}, fmt.Errorf("page number %d not found", targetPageNumber) } diff --git a/lib/signer/xref.go b/lib/signer/xref.go index cb658b5..f86d0dd 100644 --- a/lib/signer/xref.go +++ b/lib/signer/xref.go @@ -9,17 +9,11 @@ import ( "io" "strconv" "strings" - - cContext "context" - - log "github.com/Zomato/espresso/lib/logger" ) func (context *SignContext) writeXref() error { - ctx := cContext.Background() if _, err := context.OutputBuffer.Write([]byte("\n")); err != nil { - log.Logger.Error(ctx, "failed to write new line before xref", err, nil) return fmt.Errorf("failed to write newline before xref: %w", err) } context.NewXrefStart = int64(context.OutputBuffer.Buff.Len()) @@ -30,7 +24,6 @@ func (context *SignContext) writeXref() error { case "stream": return context.writeXrefStream() default: - log.Logger.Error(ctx, "unknown xref type", nil, map[string]any{"type": context.PDFReader.XrefInformation.Type}) return fmt.Errorf("unknown xref type: %s", context.PDFReader.XrefInformation.Type) } } @@ -38,7 +31,6 @@ func (context *SignContext) writeXref() error { func (context *SignContext) getLastObjectIDFromXref() (uint32, error) { xref := context.PDFReader.Xref() if len(xref) == 0 { - log.Logger.Error(cContext.Background(), "no xref entries found", nil, nil) return 0, fmt.Errorf("no xref entries found") } @@ -55,37 +47,31 @@ func (context *SignContext) getLastObjectIDFromXref() (uint32, error) { } func (context *SignContext) writeIncrXrefTable() error { - ctx := cContext.Background() if _, err := context.OutputBuffer.Write([]byte("xref\n")); err != nil { - log.Logger.Error(ctx, "failed to write incremental xref header", err, nil) return fmt.Errorf("failed to write incremental xref header: %w", err) } for _, entry := range context.updatedXrefEntries { pageXrefObj := fmt.Sprintf("%d %d\n", entry.ID, 1) if _, err := context.OutputBuffer.Write([]byte(pageXrefObj)); err != nil { - log.Logger.Error(ctx, "failed to write updated xref object", err, nil) return fmt.Errorf("failed to write updated xref object: %w", err) } xrefLine := fmt.Sprintf("%010d 00000 n\r\n", entry.Offset) if _, err := context.OutputBuffer.Write([]byte(xrefLine)); err != nil { - log.Logger.Error(ctx, "failed to write updated incremental xref entry", err, nil) return fmt.Errorf("failed to write updated incremental xref entry: %w", err) } } startXrefObj := fmt.Sprintf("%d %d\n", context.lastXrefID+1, len(context.newXrefEntries)) if _, err := context.OutputBuffer.Write([]byte(startXrefObj)); err != nil { - log.Logger.Error(ctx, "failed to write starting xref object", err, nil) return fmt.Errorf("failed to write starting xref object: %w", err) } for _, entry := range context.newXrefEntries { xrefLine := fmt.Sprintf("%010d 00000 n\r\n", entry.Offset) if _, err := context.OutputBuffer.Write([]byte(xrefLine)); err != nil { - log.Logger.Error(ctx, "failed to write incremental xref entry", err, nil) return fmt.Errorf("failed to write incremental xref entry: %w", err) } } @@ -94,7 +80,6 @@ func (context *SignContext) writeIncrXrefTable() error { } func (context *SignContext) writeXrefStream() error { - ctx := cContext.Background() var buffer bytes.Buffer @@ -104,31 +89,26 @@ func (context *SignContext) writeXrefStream() error { } if err := writeXrefStreamEntries(&buffer, context); err != nil { - log.Logger.Error(ctx, "failed to write xref stream entries", err, nil) return fmt.Errorf("failed to write xref stream entries: %w", err) } streamBytes, err := encodeXrefStream(buffer.Bytes(), predictor) if err != nil { - log.Logger.Error(ctx, "failed to encode xref stream", err, nil) return fmt.Errorf("failed to encode xref stream: %w", err) } var xrefStreamObject bytes.Buffer if err := writeXrefStreamHeader(&xrefStreamObject, context, len(streamBytes)); err != nil { - log.Logger.Error(ctx, "failed to write xref stream header", err, nil) return fmt.Errorf("failed to write xref stream header: %w", err) } if err := writeXrefStreamContent(&xrefStreamObject, streamBytes); err != nil { - log.Logger.Error(ctx, "failed to write xref stream content", err, nil) return fmt.Errorf("failed to write xref stream content: %w", err) } _, err = context.addObject(xrefStreamObject.Bytes()) if err != nil { - log.Logger.Error(ctx, "failed to add xref stream object", err, nil) return fmt.Errorf("failed to add xref stream object: %w", err) } diff --git a/lib/templatestore/diskstore.go b/lib/templatestore/diskstore.go index 2511b18..85bb203 100644 --- a/lib/templatestore/diskstore.go +++ b/lib/templatestore/diskstore.go @@ -7,8 +7,6 @@ import ( "os" "path/filepath" "text/template" - - log "github.com/Zomato/espresso/lib/logger" ) // DiskTemplateStorage is a concrete implementation of TemplateStorageAdapter for disk storage. @@ -18,14 +16,12 @@ type DiskTemplateStorage struct { func (d *DiskTemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateRequest) (*template.Template, error) { if req.TemplatePath == "" { - log.Logger.Error(ctx, "template path is required for disk storage", nil, nil) return nil, fmt.Errorf("template path is required for disk storage") } // get template from filepath templatePath := req.TemplatePath templateFile, err := template.ParseFiles(templatePath) if err != nil { - log.Logger.Error(ctx, "unable to parse template file", err, nil) return nil, fmt.Errorf("unable to parse template file: %v", err) } @@ -35,7 +31,6 @@ func (d *DiskTemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateR func (d *DiskTemplateStorage) PutDocument(ctx context.Context, req *PostDocumentRequest, reader *io.Reader) (string, error) { if req.FilePath == "" { - log.Logger.Error(ctx, "file path is required for disk storage", nil, nil) return "", fmt.Errorf("file path is required for disk storage") } // Create directories if they don't exist @@ -43,21 +38,18 @@ func (d *DiskTemplateStorage) PutDocument(ctx context.Context, req *PostDocument // make directory from req.filepath, dont append output err := os.MkdirAll(dir, 0755) if err != nil { - log.Logger.Error(ctx, "failed to create directory", err, nil) return "", fmt.Errorf("failed to create directory: %v", err) } // Create the file file, err := os.Create(req.FilePath) if err != nil { - log.Logger.Error(ctx, "failed to create file", err, nil) return "", fmt.Errorf("failed to create file: %v", err) } defer file.Close() // Copy the stream to the file if _, err := io.Copy(file, *reader); err != nil { - log.Logger.Error(ctx, "failed to write file", err, nil) return "", fmt.Errorf("failed to write file: %v", err) } @@ -65,13 +57,11 @@ func (d *DiskTemplateStorage) PutDocument(ctx context.Context, req *PostDocument } func (d *DiskTemplateStorage) GetDocument(ctx context.Context, req *GetDocumentRequest) (io.Reader, error) { if req.FilePath == "" { - log.Logger.Error(ctx, "file path is required for disk storage", nil, nil) return nil, fmt.Errorf("file path is required for disk storage") } // Open the file for reading file, err := os.Open(req.FilePath) if err != nil { - log.Logger.Error(ctx, "failed to open file", err, nil) return nil, fmt.Errorf("failed to open file: %v", err) } diff --git a/lib/templatestore/s3store.go b/lib/templatestore/s3store.go index 67cc7da..a6dfd72 100644 --- a/lib/templatestore/s3store.go +++ b/lib/templatestore/s3store.go @@ -6,7 +6,6 @@ import ( "io" "text/template" - log "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/s3" ) @@ -24,7 +23,6 @@ func NewS3StorageAdapter(ctx context.Context, options ...func(*s3.Config)) (*S3T func (s *S3TemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateRequest) (*template.Template, error) { if req.TemplateS3Path == "" { - log.Logger.Error(ctx, "template path is required for S3 storage", nil, nil) return nil, fmt.Errorf("template path is required for S3 storage") } reader, err := s.client.GetFileReader(ctx, req.TemplateS3Path) @@ -40,13 +38,11 @@ func (s *S3TemplateStorage) GetTemplate(ctx context.Context, req *GetTemplateReq func (s *S3TemplateStorage) PutDocument(ctx context.Context, req *PostDocumentRequest, reader *io.Reader) (string, error) { if req.FileS3Path == "" { - log.Logger.Error(ctx, "file S3 path is required for S3 storage", nil, nil) return "", fmt.Errorf("file S3 path is required for S3 storage") } // Upload the file to S3 _, err := s.client.UploadFile(ctx, req.FileS3Path, *reader) if err != nil { - log.Logger.Error(ctx, "failed to upload file to S3", nil, nil) return "", fmt.Errorf("failed to upload file to S3: %v", err) } @@ -54,7 +50,6 @@ func (s *S3TemplateStorage) PutDocument(ctx context.Context, req *PostDocumentRe } func (s *S3TemplateStorage) GetDocument(ctx context.Context, req *GetDocumentRequest) (io.Reader, error) { if req.FileS3Path == "" { - log.Logger.Error(ctx, "file S3 path is required for S3", nil, nil) return nil, fmt.Errorf("file S3 path is required for S3 storage") } return s.client.GetFileReader(ctx, req.FileS3Path) diff --git a/lib/templatestore/streamstore.go b/lib/templatestore/streamstore.go index 2995c13..9979b76 100644 --- a/lib/templatestore/streamstore.go +++ b/lib/templatestore/streamstore.go @@ -6,8 +6,6 @@ import ( "fmt" "io" "text/template" - - log "github.com/Zomato/espresso/lib/logger" ) type StreamStorage struct { @@ -15,7 +13,6 @@ type StreamStorage struct { func (s *StreamStorage) GetTemplate(ctx context.Context, req *GetTemplateRequest) (*template.Template, error) { if req.TemplateBytes == nil { - log.Logger.Error(ctx, "input template stream is required for strem storage", nil, nil) return nil, fmt.Errorf("input template stream is required for stream storage") } @@ -25,7 +22,6 @@ func (s *StreamStorage) PutDocument(ctx context.Context, req *PostDocumentReques // Read all bytes from the rod.StreamReader pdfBytes, err := io.ReadAll(*reader) if err != nil { - log.Logger.Error(ctx, "failed to read PDF stream", err, nil) return "", fmt.Errorf("failed to read PDF stream: %v", err) } @@ -35,7 +31,6 @@ func (s *StreamStorage) PutDocument(ctx context.Context, req *PostDocumentReques } func (s *StreamStorage) GetDocument(ctx context.Context, req *GetDocumentRequest) (io.Reader, error) { if req.InputFileBytes == nil { - log.Logger.Error(ctx, "input file bytes are required for stream storage", nil, nil) return nil, fmt.Errorf("input file bytes are required for stream storage") } diff --git a/lib/workerpool/pool.go b/lib/workerpool/pool.go index 7d7fe63..02f6306 100644 --- a/lib/workerpool/pool.go +++ b/lib/workerpool/pool.go @@ -1,10 +1,8 @@ package workerpool import ( - "context" "time" - log "github.com/Zomato/espresso/lib/logger" "github.com/panjf2000/ants/v2" ) @@ -31,7 +29,6 @@ func Initialize(size int, expiryDuration time.Duration) { ants.WithExpiryDuration(expiryDuration), ) if err != nil { - log.Logger.Error(context.Background(), "could not initialize worker pool", err, nil) panic(err) } From 59c50d9b046343b74a3852828e5e5dfd38a15a24 Mon Sep 17 00:00:00 2001 From: Sushant Date: Sat, 5 Apr 2025 09:32:24 +0530 Subject: [PATCH 08/13] moved zero log implementation from lib to service --- lib/go.mod | 4 ---- lib/go.sum | 18 ------------------ lib/logger/logger.go | 13 ++----------- service/go.mod | 3 ++- service/main.go | 5 +++++ {lib/logger => service/utils}/zerolog.go | 13 +++++++------ 6 files changed, 16 insertions(+), 40 deletions(-) rename {lib/logger => service/utils}/zerolog.go (65%) diff --git a/lib/go.mod b/lib/go.mod index 51f24ab..160cc49 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -40,16 +40,12 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect github.com/aws/smithy-go v1.22.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rs/zerolog v1.34.0 // indirect github.com/ysmood/fetchup v0.3.0 // indirect github.com/ysmood/goob v0.4.0 // indirect github.com/ysmood/got v0.40.0 // indirect github.com/ysmood/gson v0.7.3 // indirect github.com/ysmood/leakless v0.9.0 // indirect golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/lib/go.sum b/lib/go.sum index de136d8..6055330 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -38,7 +38,6 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5 github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/digitorus/pdf v0.1.2 h1:RjYEJNbiV6Kcn8QzRi6pwHuOaSieUUrg4EZo4b7KuIQ= @@ -52,26 +51,14 @@ github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA= github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg= github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM= github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= -github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/panjf2000/ants/v2 v2.11.2 h1:AVGpMSePxUNpcLaBO34xuIgM1ZdKOiGnpxLXixLi5Jo= github.com/panjf2000/ants/v2 v2.11.2/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= -github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/ysmood/fetchup v0.3.0 h1:UhYz9xnLEVn2ukSuK3KCgcznWpHMdrmbsPpllcylyu8= @@ -92,11 +79,6 @@ golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/lib/logger/logger.go b/lib/logger/logger.go index 5ce7e02..ae03017 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -2,11 +2,9 @@ package log import ( "context" - "sync" ) var ( - once sync.Once // Assigning default no-op logger. Later it will be replaced by actual logger(if provided) inside init function. Logger ILogger = newNoOpLogger() @@ -30,13 +28,6 @@ type ILogger interface { Debug(ctx context.Context, msg string, fields Fields) } -func init() { - // Replace with ILogger implementation to use logger of your choice. - - once.Do(func() { - zeroLog := newZeroLog() - Logger = zeroLog - - Logger.Info(context.Background(), "Logger: ZeroLog initialized", nil) - }) +func Initialize(loggerInstance ILogger) { + Logger = loggerInstance } diff --git a/service/go.mod b/service/go.mod index 5a15005..6276f33 100644 --- a/service/go.mod +++ b/service/go.mod @@ -7,10 +7,12 @@ toolchain go1.23.1 require ( github.com/Zomato/espresso/lib v0.0.0-20250321161824-082e62c67636 github.com/go-rod/rod v0.116.2 + github.com/rs/zerolog v1.34.0 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.10.0 ) +// replace github.com/Zomato/espresso/lib => github.com/x-sushant-x/espresso/lib v0.0.0-b0f8f60eedca0a2a68e8a223fb5db24471fa25e0 replace github.com/Zomato/espresso/lib => ../lib require ( @@ -53,7 +55,6 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/panjf2000/ants/v2 v2.11.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect - github.com/rs/zerolog v1.34.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect diff --git a/service/main.go b/service/main.go index 8dbe2d7..6c90914 100644 --- a/service/main.go +++ b/service/main.go @@ -9,15 +9,20 @@ import ( "github.com/Zomato/espresso/lib/browser_manager" + customLogger "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/workerpool" "github.com/Zomato/espresso/service/controller/pdf_generation" "github.com/Zomato/espresso/service/internal/pkg/viperpkg" + "github.com/Zomato/espresso/service/utils" "github.com/spf13/viper" ) func main() { ctx := context.Background() + zeroLogger := utils.NewZeroLogger() + customLogger.Initialize(zeroLogger) + viperpkg.InitConfig() log.Printf("Template storage type: %s", viper.GetString("template_storage.storage_type")) diff --git a/lib/logger/zerolog.go b/service/utils/zerolog.go similarity index 65% rename from lib/logger/zerolog.go rename to service/utils/zerolog.go index e6a446e..1dd4d1d 100644 --- a/lib/logger/zerolog.go +++ b/service/utils/zerolog.go @@ -1,10 +1,11 @@ -package log +package utils import ( "context" "os" "time" + customLogger "github.com/Zomato/espresso/lib/logger" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) @@ -13,7 +14,7 @@ type ZeroLog struct { logger zerolog.Logger } -func newZeroLog() ZeroLog { +func NewZeroLogger() ZeroLog { log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}) zerolog.SetGlobalLevel(zerolog.DebugLevel) @@ -30,18 +31,18 @@ func addFields(event *zerolog.Event, fields map[string]any) *zerolog.Event { return event } -func (l ZeroLog) Info(ctx context.Context, msg string, fields Fields) { +func (l ZeroLog) Info(ctx context.Context, msg string, fields customLogger.Fields) { addFields(l.logger.Info(), fields).Msg(msg) } -func (l ZeroLog) Warn(ctx context.Context, msg string, fields Fields) { +func (l ZeroLog) Warn(ctx context.Context, msg string, fields customLogger.Fields) { addFields(l.logger.Warn(), fields).Msg(msg) } -func (l ZeroLog) Error(ctx context.Context, msg string, err error, fields Fields) { +func (l ZeroLog) Error(ctx context.Context, msg string, err error, fields customLogger.Fields) { addFields(l.logger.Err(err), fields).Msg(msg) } -func (l ZeroLog) Debug(ctx context.Context, msg string, fields Fields) { +func (l ZeroLog) Debug(ctx context.Context, msg string, fields customLogger.Fields) { addFields(l.logger.Debug(), fields).Msg(msg) } From 1b335f63f0af4a3af2b241dc3d9e148386ece5a8 Mon Sep 17 00:00:00 2001 From: Sushant Date: Sat, 5 Apr 2025 17:05:47 +0530 Subject: [PATCH 09/13] removed local code from Dockerfile --- service/go.mod | 3 --- 1 file changed, 3 deletions(-) diff --git a/service/go.mod b/service/go.mod index 6276f33..8e081b7 100644 --- a/service/go.mod +++ b/service/go.mod @@ -12,9 +12,6 @@ require ( github.com/stretchr/testify v1.10.0 ) -// replace github.com/Zomato/espresso/lib => github.com/x-sushant-x/espresso/lib v0.0.0-b0f8f60eedca0a2a68e8a223fb5db24471fa25e0 -replace github.com/Zomato/espresso/lib => ../lib - require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect From a25543c4521bdda2115575a27a091405acd20d23 Mon Sep 17 00:00:00 2001 From: Sushant Date: Sat, 5 Apr 2025 17:12:04 +0530 Subject: [PATCH 10/13] reverted golang version --- lib/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/go.mod b/lib/go.mod index 160cc49..1ce3470 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -1,6 +1,6 @@ module github.com/Zomato/espresso/lib -go 1.23.0 +go 1.22.4 toolchain go1.23.1 From 5dc6255d79148d6bbeb36f1a831de6babe9f6124 Mon Sep 17 00:00:00 2001 From: Sushant Date: Sat, 5 Apr 2025 17:20:29 +0530 Subject: [PATCH 11/13] removed unwanted code from Dockerfile --- lib/go.mod | 2 -- service/Dockerfile | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/go.mod b/lib/go.mod index 1ce3470..c25849c 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -2,8 +2,6 @@ module github.com/Zomato/espresso/lib go 1.22.4 -toolchain go1.23.1 - require ( github.com/aws/aws-sdk-go-v2 v1.36.3 github.com/aws/aws-sdk-go-v2/config v1.29.9 diff --git a/service/Dockerfile b/service/Dockerfile index ea6b21a..597e2d9 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -19,8 +19,6 @@ ENV GOSUMDB=off \ # Copy go.mod and go.sum first to leverage Docker cache COPY service/go.mod service/go.sum ./service/ -COPY lib /app/espresso/lib/ - # Download dependencies RUN cd service && \ go mod download @@ -72,4 +70,4 @@ RUN mkdir -p $GOPATH/pkg/mod && chmod -R 777 $GOPATH/pkg/mod EXPOSE 8081 # Change the CMD to run the Go application directly -CMD ["go", "run","-mod=mod", "/app/espresso/service/main.go"] \ No newline at end of file +CMD ["go", "run","-mod=mod", "/app/espresso/service/main.go"] From eb0a899da060dc5689b3c278a2adb224997bf934 Mon Sep 17 00:00:00 2001 From: Sushant Date: Mon, 7 Apr 2025 14:39:06 +0530 Subject: [PATCH 12/13] added missed log and removed unwanted stuff from Dockerfile --- lib/workerpool/pool.go | 4 +++- service/Dockerfile | 4 ---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/workerpool/pool.go b/lib/workerpool/pool.go index 02f6306..a87c035 100644 --- a/lib/workerpool/pool.go +++ b/lib/workerpool/pool.go @@ -1,8 +1,10 @@ package workerpool import ( + "context" "time" + log "github.com/Zomato/espresso/lib/logger" "github.com/panjf2000/ants/v2" ) @@ -29,7 +31,7 @@ func Initialize(size int, expiryDuration time.Duration) { ants.WithExpiryDuration(expiryDuration), ) if err != nil { - + log.Logger.Error(context.Background(), "could not initialize worker pool", err, nil) panic(err) } pool = &WorkerPool{Pool: workerPool} diff --git a/service/Dockerfile b/service/Dockerfile index 597e2d9..be8d93c 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -63,10 +63,6 @@ RUN chown -R chrome:chrome /app # Set the user to chrome for the container USER chrome -# To download dependencies as non root user -ENV GOPATH=/home/chrome/go -RUN mkdir -p $GOPATH/pkg/mod && chmod -R 777 $GOPATH/pkg/mod - EXPOSE 8081 # Change the CMD to run the Go application directly From d372dd33d467b7642f585209885779252ffada4f Mon Sep 17 00:00:00 2001 From: Sushant Date: Mon, 7 Apr 2025 14:44:09 +0530 Subject: [PATCH 13/13] added documentation for Logger --- docs/QuickStart.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/QuickStart.md b/docs/QuickStart.md index 5379596..44c7df6 100644 --- a/docs/QuickStart.md +++ b/docs/QuickStart.md @@ -83,6 +83,31 @@ This will: - "PDF generation failed": Check HTML template validity - "Storage error": Verify storage configuration and permissions +## Logger Setup +The `ILogger` interface present inside `/lib/logger.go` supports the following log levels: + +- `Info` +- `Warn` +- `Error` +- `Debug` + +Each method accepts: + +- `ctx`: A `context.Context` for request-scoped logging or tracing +- `msg`: Log message string +- `fields`: Key-value pairs for structured logging + +#### Setting Up Logger + +1. Implement the `ILogger` interface using your preferred logger. +2. Call `log.Initialize(yourLoggerInstance)` inside `/service/main.go` +3. Use `log.Logger.Info()`, `log.Logger.Error()`, etc., throughout your code. + +#### Example: Using Zerolog +A sample implementation of ILogger interface can be found at `/service/utils/zerolog.go` and initialized in `service/main.go` + +
+ ## Next Steps - Check the API documentation for more endpoints