Skip to content

Commit 1caca47

Browse files
committed
add zerolog logger
1 parent eaa13f1 commit 1caca47

16 files changed

+244
-95
lines changed

api/go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/gofiber/fiber/v2 v2.34.0
1313
github.com/gofiber/swagger v0.0.1
1414
github.com/google/uuid v1.3.0
15+
github.com/hirosassa/zerodriver v0.1.2
1516
github.com/joho/godotenv v1.4.0
1617
github.com/nyaruka/phonenumbers v1.1.0
1718
github.com/palantir/stacktrace v0.0.0-20161112013806-78658fd2d177

api/go.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
bou.ke/monkey v1.0.2 h1:kWcnsrCNUatbxncxR/ThdYqbytgOIArtYWqcQLQzKLI=
12
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
23
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
34
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -251,6 +252,8 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR
251252
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
252253
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
253254
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
255+
github.com/hirosassa/zerodriver v0.1.2 h1:tOBstLRxuUs8bol1Ho+r3xTs5Y8DKv3dqA7DnA+pjo0=
256+
github.com/hirosassa/zerodriver v0.1.2/go.mod h1:+P2wLNeI1pgxJHbpyi2b6thTlfLjdN3Qptv34GNvXQA=
254257
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
255258
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
256259
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=

api/pkg/di/container.go

Lines changed: 70 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ package di
33
import (
44
"context"
55
"fmt"
6-
"io"
7-
"log"
86
"os"
7+
"strconv"
98
"time"
109

1110
"firebase.google.com/go/messaging"
11+
"github.com/hirosassa/zerodriver"
12+
"github.com/rs/zerolog"
1213

1314
firebase "firebase.google.com/go"
1415
"firebase.google.com/go/auth"
@@ -30,7 +31,6 @@ import (
3031
"github.com/NdoleStudio/http-sms-manager/pkg/handlers"
3132
"github.com/NdoleStudio/http-sms-manager/pkg/telemetry"
3233
"github.com/NdoleStudio/http-sms-manager/pkg/validators"
33-
"github.com/rs/zerolog"
3434
"gorm.io/driver/postgres"
3535
gormLogger "gorm.io/gorm/logger"
3636
)
@@ -48,7 +48,7 @@ type Container struct {
4848
func NewContainer(projectID string) (container *Container) {
4949
container = &Container{
5050
projectID: projectID,
51-
logger: logger().WithService(fmt.Sprintf("%T", container)),
51+
logger: logger(3).WithService(fmt.Sprintf("%T", container)),
5252
}
5353

5454
container.RegisterMessageListeners()
@@ -109,9 +109,21 @@ func (container *Container) AuthRouter() fiber.Router {
109109
}
110110

111111
// Logger creates a new instance of telemetry.Logger
112-
func (container *Container) Logger() telemetry.Logger {
112+
func (container *Container) Logger(skipFrameCount ...int) telemetry.Logger {
113113
container.logger.Debug("creating telemetry.Logger")
114-
return logger()
114+
if len(skipFrameCount) > 0 {
115+
return logger(skipFrameCount[0])
116+
}
117+
return logger(3)
118+
}
119+
120+
// GormLogger creates a new instance of gormLogger.Interface
121+
func (container *Container) GormLogger() gormLogger.Interface {
122+
container.logger.Debug("creating gormLogger.Interface")
123+
return telemetry.NewGormLogger(
124+
container.Tracer(),
125+
container.Logger(6),
126+
)
115127
}
116128

117129
// DB creates an instance of gorm.DB if it has not been created already
@@ -122,14 +134,7 @@ func (container *Container) DB() (db *gorm.DB) {
122134

123135
container.logger.Debug(fmt.Sprintf("creating %T", db))
124136

125-
gl := gormLogger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), gormLogger.Config{
126-
SlowThreshold: 200 * time.Millisecond,
127-
LogLevel: gormLogger.Info,
128-
IgnoreRecordNotFoundError: false,
129-
Colorful: true,
130-
})
131-
132-
db, err := gorm.Open(postgres.Open(os.Getenv("DATABASE_URL")), &gorm.Config{Logger: gl})
137+
db, err := gorm.Open(postgres.Open(os.Getenv("DATABASE_URL")), &gorm.Config{Logger: container.GormLogger()})
133138
if err != nil {
134139
container.logger.Fatal(err)
135140
}
@@ -559,29 +564,63 @@ func (container *Container) UserRepository() repositories.UserRepository {
559564
)
560565
}
561566

562-
func logger() telemetry.Logger {
567+
func logger(skipFrameCount int) telemetry.Logger {
563568
hostname, _ := os.Hostname()
564-
fields := fiber.Map{
565-
"pid": os.Getpid(),
569+
fields := map[string]string{
570+
"pid": strconv.Itoa(os.Getpid()),
566571
"hostname": hostname,
567572
}
568573

569-
var writer io.Writer = zerolog.ConsoleWriter{Out: os.Stderr}
570-
if !isLocal() {
571-
writer = os.Stderr
572-
//gcpWriter, err := zlg.NewCloudLoggingWriter(
573-
// context.Background(),
574-
// os.Getenv("GCP_PROJECT_ID"),
575-
// fmt.Sprintf("projects/%s/logs/run.googleapis.com%%2Fstderr", os.Getenv("GCP_PROJECT_ID")),
576-
// zlg.CloudLoggingOptions{},
577-
//)
578-
//if err != nil {
579-
// log.Fatal("could not create a CloudLoggingWriter")
580-
//}
581-
//writer = gcpWriter
574+
return telemetry.NewZerologLogger(
575+
os.Getenv("GCP_PROJECT_ID"),
576+
fields,
577+
3,
578+
logDriver(skipFrameCount),
579+
nil,
580+
)
581+
}
582+
583+
func logDriver(skipFrameCount int) *zerodriver.Logger {
584+
if isLocal() {
585+
return consoleLogger(skipFrameCount)
586+
}
587+
return jsonLogger(skipFrameCount)
588+
}
589+
590+
func jsonLogger(skipFrameCount int) *zerodriver.Logger {
591+
logLevel := zerolog.DebugLevel
592+
zerolog.SetGlobalLevel(logLevel)
593+
594+
// See: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
595+
logLevelSeverity := map[zerolog.Level]string{
596+
zerolog.TraceLevel: "DEFAULT",
597+
zerolog.DebugLevel: "DEBUG",
598+
zerolog.InfoLevel: "INFO",
599+
zerolog.WarnLevel: "WARNING",
600+
zerolog.ErrorLevel: "ERROR",
601+
zerolog.PanicLevel: "CRITICAL",
602+
zerolog.FatalLevel: "CRITICAL",
603+
}
604+
605+
zerolog.LevelFieldName = "severity"
606+
zerolog.LevelFieldMarshalFunc = func(l zerolog.Level) string {
607+
return logLevelSeverity[l]
582608
}
609+
zerolog.TimestampFieldName = "time"
610+
zerolog.TimeFieldFormat = time.RFC3339Nano
611+
612+
zl := zerolog.New(os.Stderr).With().Timestamp().CallerWithSkipFrameCount(skipFrameCount).Logger()
613+
return &zerodriver.Logger{Logger: &zl}
614+
}
583615

584-
return telemetry.NewZerologLogger(zerolog.New(writer).With().Fields(fields).Timestamp().CallerWithSkipFrameCount(3))
616+
func consoleLogger(skipFrameCount int) *zerodriver.Logger {
617+
l := zerolog.New(
618+
zerolog.ConsoleWriter{
619+
Out: os.Stderr,
620+
}).With().Timestamp().CallerWithSkipFrameCount(skipFrameCount).Logger()
621+
return &zerodriver.Logger{
622+
Logger: &l,
623+
}
585624
}
586625

587626
func isLocal() bool {

api/pkg/repositories/event_listener_log_repository.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88

99
// EventListenerLogRepository loads and persists an entities.EventListenerLog
1010
type EventListenerLogRepository interface {
11-
// Save a new entities.EventListenerLog
11+
// Store a new entities.EventListenerLog
1212
Store(ctx context.Context, log *entities.EventListenerLog) error
1313

1414
// Has verifies that the listener has not already been called

api/pkg/repositories/gorm_event_listener_log_repository.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ func NewGormEventListenerLogRepository(
3030
}
3131
}
3232

33-
// Save a new entities.Message
33+
// Store a new entities.Message
3434
func (repository *gormEventListenerLogRepository) Store(ctx context.Context, message *entities.EventListenerLog) error {
3535
ctx, span := repository.tracer.Start(ctx)
3636
defer span.End()
3737

38-
if err := repository.db.Create(message).Error; err != nil {
38+
if err := repository.db.WithContext(ctx).Create(message).Error; err != nil {
3939
msg := fmt.Sprintf("cannot save message with ID [%s]", message.ID)
4040
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
4141
}
@@ -49,7 +49,7 @@ func (repository *gormEventListenerLogRepository) Has(ctx context.Context, event
4949
defer span.End()
5050

5151
var exists bool
52-
err := repository.db.Model(&entities.EventListenerLog{}).
52+
err := repository.db.WithContext(ctx).Model(&entities.EventListenerLog{}).
5353
Select("count(*) > 0").
5454
Where("event_id = ?", eventID).
5555
Where("handler = ?", handler).

api/pkg/repositories/gorm_event_repository.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func (repository *gormEventRepository) FetchAll(ctx context.Context) (*[]cloudev
5353
defer span.End()
5454

5555
var events []GormEvent
56-
if err := repository.db.Order("time ASC").Find(&events).Error; err != nil {
56+
if err := repository.db.WithContext(ctx).Order("time ASC").Find(&events).Error; err != nil {
5757
msg := fmt.Sprintf("cannot fetch all cloudevents")
5858
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
5959
}
@@ -88,7 +88,7 @@ func (repository *gormEventRepository) Save(ctx context.Context, event cloudeven
8888
Data: datatypes.JSON(data),
8989
}
9090

91-
if err = repository.db.Create(gormEvent).Error; err != nil {
91+
if err = repository.db.WithContext(ctx).Create(gormEvent).Error; err != nil {
9292
return stacktrace.Propagate(err, fmt.Sprintf("cannot save event [%s] and type [%s]", event.ID(), event.Type()))
9393
}
9494

api/pkg/repositories/gorm_heartbeat_repository.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func (repository *gormHeartbeatRepository) Index(ctx context.Context, owner stri
3535
ctx, span := repository.tracer.Start(ctx)
3636
defer span.End()
3737

38-
query := repository.db.Where("owner = ?", owner)
38+
query := repository.db.WithContext(ctx).Where("owner = ?", owner)
3939
if len(params.Query) > 0 {
4040
queryPattern := "%" + params.Query + "%"
4141
query.Where("quantity ILIKE ?", queryPattern)
@@ -55,7 +55,7 @@ func (repository *gormHeartbeatRepository) Store(ctx context.Context, heartbeat
5555
ctx, span := repository.tracer.Start(ctx)
5656
defer span.End()
5757

58-
if err := repository.db.Create(heartbeat).Error; err != nil {
58+
if err := repository.db.WithContext(ctx).Create(heartbeat).Error; err != nil {
5959
msg := fmt.Sprintf("cannot save heartbeat with ID [%s]", heartbeat.ID)
6060
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
6161
}

api/pkg/repositories/gorm_message_repository.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (repository *gormMessageRepository) Index(ctx context.Context, owner string
4040
ctx, span := repository.tracer.Start(ctx)
4141
defer span.End()
4242

43-
query := repository.db.Where("owner = ?", owner).Where("contact = ?", contact)
43+
query := repository.db.WithContext(ctx).Where("owner = ?", owner).Where("contact = ?", contact)
4444
if len(params.Query) > 0 {
4545
queryPattern := "%" + params.Query + "%"
4646
query.Where("content ILIKE ?", queryPattern)
@@ -60,7 +60,7 @@ func (repository *gormMessageRepository) Store(ctx context.Context, message *ent
6060
ctx, span := repository.tracer.Start(ctx)
6161
defer span.End()
6262

63-
if err := repository.db.Create(message).Error; err != nil {
63+
if err := repository.db.WithContext(ctx).Create(message).Error; err != nil {
6464
msg := fmt.Sprintf("cannot save message with ID [%s]", message.ID)
6565
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
6666
}
@@ -74,7 +74,7 @@ func (repository *gormMessageRepository) Load(ctx context.Context, messageID uui
7474
defer span.End()
7575

7676
message := new(entities.Message)
77-
err := repository.db.First(message, messageID).Error
77+
err := repository.db.WithContext(ctx).First(message, messageID).Error
7878
if errors.Is(err, gorm.ErrRecordNotFound) {
7979
msg := fmt.Sprintf("message with ID [%s] does not exist", message.ID)
8080
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, ErrCodeNotFound, msg))
@@ -93,7 +93,7 @@ func (repository *gormMessageRepository) Update(ctx context.Context, message *en
9393
ctx, span := repository.tracer.Start(ctx)
9494
defer span.End()
9595

96-
if err := repository.db.Save(message).Error; err != nil {
96+
if err := repository.db.WithContext(ctx).Save(message).Error; err != nil {
9797
msg := fmt.Sprintf("cannot update message with ID [%s]", message.ID)
9898
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
9999
}
@@ -109,7 +109,7 @@ func (repository *gormMessageRepository) GetOutstanding(ctx context.Context, own
109109
messages := new([]entities.Message)
110110
err := crdbgorm.ExecuteTx(ctx, repository.db, nil,
111111
func(tx *gorm.DB) error {
112-
return tx.Model(messages).
112+
return tx.WithContext(ctx).Model(messages).
113113
Clauses(clause.Returning{}).
114114
Where(
115115
"id IN (?)",

api/pkg/repositories/gorm_message_thread_repository.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (repository *gormMessageThreadRepository) Store(ctx context.Context, thread
4040
ctx, span := repository.tracer.Start(ctx)
4141
defer span.End()
4242

43-
if err := repository.db.Clauses(clause.OnConflict{DoNothing: true}).Create(thread).Error; err != nil {
43+
if err := repository.db.WithContext(ctx).Clauses(clause.OnConflict{DoNothing: true}).Create(thread).Error; err != nil {
4444
msg := fmt.Sprintf("cannot save message thread with ID [%s]", thread.ID)
4545
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
4646
}
@@ -53,7 +53,7 @@ func (repository *gormMessageThreadRepository) Update(ctx context.Context, threa
5353
ctx, span := repository.tracer.Start(ctx)
5454
defer span.End()
5555

56-
if err := repository.db.Save(thread).Error; err != nil {
56+
if err := repository.db.WithContext(ctx).Save(thread).Error; err != nil {
5757
msg := fmt.Sprintf("cannot update message thread thread with ID [%s]", thread.ID)
5858
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
5959
}
@@ -68,7 +68,7 @@ func (repository *gormMessageThreadRepository) LoadByOwnerContact(ctx context.Co
6868

6969
thread := new(entities.MessageThread)
7070

71-
err := repository.db.Where("owner = ?", owner).Where("contact = ?", contact).First(thread).Error
71+
err := repository.db.WithContext(ctx).Where("owner = ?", owner).Where("contact = ?", contact).First(thread).Error
7272
if errors.Is(err, gorm.ErrRecordNotFound) {
7373
msg := fmt.Sprintf("thread with owner [%s] and contact [%s] does not exist", owner, contact)
7474
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, ErrCodeNotFound, msg))
@@ -89,7 +89,7 @@ func (repository *gormMessageThreadRepository) Load(ctx context.Context, ID uuid
8989

9090
thread := new(entities.MessageThread)
9191

92-
err := repository.db.First(thread, ID).Error
92+
err := repository.db.WithContext(ctx).First(thread, ID).Error
9393
if errors.Is(err, gorm.ErrRecordNotFound) {
9494
msg := fmt.Sprintf("thread with id [%s] not found", ID)
9595
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, ErrCodeNotFound, msg))
@@ -108,7 +108,7 @@ func (repository *gormMessageThreadRepository) Index(ctx context.Context, owner
108108
ctx, span := repository.tracer.Start(ctx)
109109
defer span.End()
110110

111-
query := repository.db.Where("owner = ?", owner)
111+
query := repository.db.WithContext(ctx).Where("owner = ?", owner)
112112

113113
if isArchived {
114114
query.Where("is_archived = ?", isArchived)

api/pkg/repositories/gorm_phone_repository.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (repository *gormPhoneRepository) Upsert(ctx context.Context, phone *entiti
3939
err := crdbgorm.ExecuteTx(ctx, repository.db, nil, func(tx *gorm.DB) error {
4040
existingPhone := new(entities.Phone)
4141

42-
err := tx.Model(&phone).
42+
err := tx.WithContext(ctx).Model(&phone).
4343
Where("user_id = ?", phone.UserID).
4444
Where("phone_number = ?", phone.PhoneNumber).
4545
First(existingPhone).
@@ -75,7 +75,7 @@ func (repository *gormPhoneRepository) Load(ctx context.Context, userID entities
7575
defer span.End()
7676

7777
phone := new(entities.Phone)
78-
err := repository.db.Where("user_id = ?", userID).Where("phone_number = ?", phoneNumber).First(phone).Error
78+
err := repository.db.WithContext(ctx).Where("user_id = ?", userID).Where("phone_number = ?", phoneNumber).First(phone).Error
7979
if errors.Is(err, gorm.ErrRecordNotFound) {
8080
msg := fmt.Sprintf("phone with userID [%s] and phoneNumber [%s] does not exist", userID, phoneNumber)
8181
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, ErrCodeNotFound, msg))
@@ -93,7 +93,7 @@ func (repository *gormPhoneRepository) Index(ctx context.Context, userID entitie
9393
ctx, span := repository.tracer.Start(ctx)
9494
defer span.End()
9595

96-
query := repository.db.Where("user_id = ?", userID)
96+
query := repository.db.WithContext(ctx).Where("user_id = ?", userID)
9797
if len(params.Query) > 0 {
9898
queryPattern := "%" + params.Query + "%"
9999
query.Where("phone_number ILIKE ?", queryPattern)

0 commit comments

Comments
 (0)