Skip to content

Commit 24828c8

Browse files
committed
add gocqlzap and gocqlzerolog extensions
1 parent 275783e commit 24828c8

File tree

11 files changed

+357
-1
lines changed

11 files changed

+357
-1
lines changed

extensions/gocqlzap/go.mod

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module github.com/gocql/gocql/extensions/gocqlzap
2+
3+
go 1.19
4+
5+
require (
6+
github.com/gocql/gocql v1.6.0
7+
go.uber.org/zap v1.27.0
8+
)
9+
10+
require (
11+
github.com/golang/snappy v0.0.3 // indirect
12+
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
13+
go.uber.org/multierr v1.10.0 // indirect
14+
gopkg.in/inf.v0 v0.9.1 // indirect
15+
)

extensions/gocqlzap/go.sum

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
2+
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
3+
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
4+
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
5+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7+
github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU=
8+
github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8=
9+
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
10+
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
11+
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
12+
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
13+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
14+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
15+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
16+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
17+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
18+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
19+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
20+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
21+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
22+
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
23+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
24+
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
25+
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
26+
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
27+
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
28+
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
29+
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
30+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

extensions/gocqlzap/zap.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package gocqlzap
2+
3+
import (
4+
"github.com/gocql/gocql"
5+
"go.uber.org/zap"
6+
"go.uber.org/zap/zapcore"
7+
)
8+
9+
const DefaultName = "gocql"
10+
11+
type Logger interface {
12+
gocql.AdvancedLogger
13+
ZapLogger() *zap.Logger
14+
Name() string
15+
}
16+
17+
type Options struct {
18+
LogLevel zapcore.Level
19+
}
20+
21+
type logger struct {
22+
zapLogger *zap.Logger
23+
}
24+
25+
// NewZapLogger creates a new zap based logger with the logger name set to DefaultName
26+
func NewZapLogger(l *zap.Logger, opts Options) Logger {
27+
return &logger{zapLogger: l.Named(DefaultName)}
28+
}
29+
30+
// NewUnnamedZapLogger doesn't set the logger name so the user can set the name of the logger
31+
// before providing it to this function (or just leave it unset)
32+
func NewUnnamedZapLogger(l *zap.Logger) Logger {
33+
return &logger{zapLogger: l}
34+
}
35+
36+
func (rec *logger) ZapLogger() *zap.Logger {
37+
return rec.zapLogger
38+
}
39+
40+
func (rec *logger) Name() string {
41+
return rec.zapLogger.Name()
42+
}
43+
44+
func (rec *logger) log(fields []gocql.LogField) *zap.Logger {
45+
childLogger := rec.zapLogger
46+
for _, field := range fields {
47+
childLogger = childLogger.WithLazy(zap.Any(field.Name, field.Value))
48+
}
49+
return childLogger
50+
}
51+
52+
func (rec *logger) Error(msg string, fields ...gocql.LogField) {
53+
rec.log(fields).Error(msg)
54+
}
55+
56+
func (rec *logger) Warning(msg string, fields ...gocql.LogField) {
57+
rec.log(fields).Warn(msg)
58+
}
59+
60+
func (rec *logger) Info(msg string, fields ...gocql.LogField) {
61+
rec.log(fields).Info(msg)
62+
}
63+
64+
func (rec *logger) Debug(msg string, fields ...gocql.LogField) {
65+
rec.log(fields).Debug(msg)
66+
}

extensions/gocqlzap/zap_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package gocqlzap
2+
3+
import (
4+
"bytes"
5+
"github.com/gocql/gocql"
6+
"go.uber.org/zap"
7+
"go.uber.org/zap/zapcore"
8+
"io"
9+
"strings"
10+
"testing"
11+
)
12+
13+
const logLineEnding = "%%%\n%%%"
14+
15+
func NewCustomLogger(pipeTo io.Writer) zapcore.Core {
16+
cfg := zap.NewProductionEncoderConfig()
17+
cfg.LineEnding = logLineEnding
18+
return zapcore.NewCore(
19+
zapcore.NewConsoleEncoder(cfg),
20+
zapcore.AddSync(pipeTo),
21+
zapcore.DebugLevel,
22+
)
23+
}
24+
25+
func TestGocqlZapLog(t *testing.T) {
26+
b := &bytes.Buffer{}
27+
logger := zap.New(NewCustomLogger(b))
28+
clusterCfg := gocql.NewCluster("0.0.0.1")
29+
clusterCfg.StructuredLogger = NewZapLogger(logger)
30+
clusterCfg.LegacyLogLevel = gocql.LogLevelDebug
31+
clusterCfg.ProtoVersion = 4
32+
session, err := clusterCfg.CreateSession()
33+
if err == nil {
34+
session.Close()
35+
t.Fatal("expected error creating session")
36+
}
37+
err = logger.Sync()
38+
if err != nil {
39+
t.Fatal("logger sync failed")
40+
}
41+
logOutput := strings.Split(b.String(), logLineEnding)
42+
found := false
43+
for _, logEntry := range logOutput {
44+
if len(logEntry) == 0 {
45+
continue
46+
}
47+
if !strings.Contains(logEntry, "info\tgocql\tunable to dial control conn %s:%v (%s): %v\t{\"host_addr\": "+
48+
"\"0.0.0.1\", \"port\": 9042, \"host_id\": \"\", \"err\": \"dial tcp 0.0.0.1:9042:") {
49+
continue
50+
} else {
51+
found = true
52+
break
53+
}
54+
}
55+
if !found {
56+
t.Fatal("log output didn't match expectations: ", strings.Join(logOutput, "\n"))
57+
}
58+
}

extensions/gocqlzerolog/go.mod

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module github.com/gocql/gocql/extensions/gocqlzerolog
2+
3+
go 1.19
4+
5+
require (
6+
github.com/gocql/gocql v1.6.0
7+
github.com/rs/zerolog v1.33.0
8+
)
9+
10+
require (
11+
github.com/golang/snappy v0.0.3 // indirect
12+
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
13+
github.com/mattn/go-colorable v0.1.13 // indirect
14+
github.com/mattn/go-isatty v0.0.19 // indirect
15+
golang.org/x/sys v0.12.0 // indirect
16+
gopkg.in/inf.v0 v0.9.1 // indirect
17+
)

extensions/gocqlzerolog/go.sum

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
2+
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
3+
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
4+
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
5+
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
6+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
7+
github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU=
8+
github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8=
9+
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
10+
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
11+
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
12+
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
13+
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
14+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
15+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
16+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
17+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
18+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
19+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
20+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
21+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
22+
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
23+
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
24+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
25+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
26+
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
27+
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
28+
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
29+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
30+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
31+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
32+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
33+
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
34+
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
35+
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
36+
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=

extensions/gocqlzerolog/zerolog.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package gocqlzerolog
2+
3+
import (
4+
"github.com/gocql/gocql"
5+
"github.com/rs/zerolog"
6+
)
7+
8+
const DefaultName = "gocql"
9+
const DefaultNameField = "logger"
10+
11+
type Logger interface {
12+
gocql.AdvancedLogger
13+
ZerologLogger() zerolog.Logger
14+
}
15+
16+
type logger struct {
17+
zerologLogger zerolog.Logger
18+
}
19+
20+
// NewZerologLogger creates a new zerolog based logger with a global context containing a field
21+
// with name "logger" and value "gocql", i.e.:
22+
//
23+
// l.With().Str("logger", "gocql").Logger()
24+
func NewZerologLogger(l zerolog.Logger) Logger {
25+
return &logger{zerologLogger: l.With().Str(DefaultNameField, DefaultName).Logger()}
26+
}
27+
28+
// NewUnnamedZerologLogger creates a new zerolog based logger without modifying its context like
29+
// NewZerologLogger does.
30+
func NewUnnamedZerologLogger(l zerolog.Logger) Logger {
31+
return &logger{zerologLogger: l}
32+
}
33+
34+
func (rec *logger) ZerologLogger() zerolog.Logger {
35+
return rec.zerologLogger
36+
}
37+
38+
func (rec *logger) log(event *zerolog.Event, fields ...gocql.LogField) *zerolog.Event {
39+
for _, field := range fields {
40+
event = event.Any(field.Name, field.Value)
41+
}
42+
return event
43+
}
44+
45+
func (rec *logger) Error(msg string, fields ...gocql.LogField) {
46+
rec.log(rec.zerologLogger.Error(), fields...).Msg(msg)
47+
}
48+
49+
func (rec *logger) Warning(msg string, fields ...gocql.LogField) {
50+
rec.log(rec.zerologLogger.Warn(), fields...).Msg(msg)
51+
}
52+
53+
func (rec *logger) Info(msg string, fields ...gocql.LogField) {
54+
rec.log(rec.zerologLogger.Info(), fields...).Msg(msg)
55+
}
56+
57+
func (rec *logger) Debug(msg string, fields ...gocql.LogField) {
58+
rec.log(rec.zerologLogger.Debug(), fields...).Msg(msg)
59+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package gocqlzerolog
2+
3+
import (
4+
"bytes"
5+
"github.com/gocql/gocql"
6+
"github.com/rs/zerolog"
7+
"strings"
8+
"testing"
9+
)
10+
11+
const logLineEnding = "%%%\n%%%"
12+
13+
func TestGocqlZeroLog(t *testing.T) {
14+
b := &bytes.Buffer{}
15+
output := zerolog.ConsoleWriter{Out: b}
16+
output.NoColor = true
17+
output.FormatExtra = func(m map[string]interface{}, buffer *bytes.Buffer) error {
18+
buffer.WriteString(logLineEnding)
19+
return nil
20+
}
21+
logger := zerolog.New(output)
22+
clusterCfg := gocql.NewCluster("0.0.0.1")
23+
clusterCfg.StructuredLogger = NewZerologLogger(logger)
24+
clusterCfg.LegacyLogLevel = gocql.LogLevelDebug
25+
clusterCfg.ProtoVersion = 4
26+
session, err := clusterCfg.CreateSession()
27+
if err == nil {
28+
session.Close()
29+
t.Fatal("expected error creating session")
30+
}
31+
logOutput := strings.Split(b.String(), logLineEnding+"\n")
32+
found := false
33+
for _, logEntry := range logOutput {
34+
if len(logEntry) == 0 {
35+
continue
36+
}
37+
if !strings.Contains(logEntry, "unable to dial control conn %s:%v (%s): %v err=\"dial tcp 0.0.0.1:9042:") ||
38+
!strings.Contains(logEntry, "host_addr=0.0.0.1 host_id= logger=gocql port=9042") {
39+
continue
40+
} else {
41+
found = true
42+
break
43+
}
44+
}
45+
if !found {
46+
t.Fatal("log output didn't match expectations: ", strings.Join(logOutput, "\n"))
47+
}
48+
}

go.sum

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMW
1212
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
1313
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
1414
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
15-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
1615
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
1716
github.com/pierrec/lz4/v4 v4.1.8 h1:ieHkV+i2BRzngO4Wd/3HGowuZStgq6QkPsD1eolNAO4=
1817
github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=

go.work

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
go 1.19
2+
3+
use (
4+
.
5+
./extensions/gocqlzap
6+
./extensions/gocqlzerolog
7+
)

0 commit comments

Comments
 (0)