Skip to content

Commit a072129

Browse files
authored
ctxlog integration (#28)
1 parent 1a8d551 commit a072129

11 files changed

+166
-156
lines changed

db.go

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"time"
1010

1111
"github.com/cenkalti/backoff/v5"
12+
"github.com/n-r-w/ctxlog"
1213
)
1314

1415
// Informer interface for database information.
@@ -38,7 +39,7 @@ type PrepareCleanUp func(db *sql.DB, databaseName string) error
3839
type testDB struct {
3940
t testing.TB
4041

41-
logger Logger // unified way to logging
42+
logger ctxlog.ILogger // unified way to logging
4243

4344
databaseName string // name of the test database
4445
url *dbURL // parsed database connection string
@@ -70,13 +71,13 @@ var (
7071
)
7172

7273
// newTDB creates a new test database and applies migrations.
73-
func newTDB(tb testing.TB, driver, dsn string, opt []Option) *testDB {
74+
func newTDB(ctx context.Context, tb testing.TB, driver, dsn string, opt []Option) *testDB {
7475
tb.Helper()
7576

7677
var (
7778
db = &testDB{
7879
t: tb,
79-
logger: NewDefaultLogger(tb),
80+
logger: ctxlog.Must(ctxlog.WithTesting(tb)),
8081
driver: driver,
8182
dsn: dsn,
8283
mode: RunModeAuto,
@@ -88,7 +89,7 @@ func newTDB(tb testing.TB, driver, dsn string, opt []Option) *testDB {
8889

8990
defer func() {
9091
if errResult != nil {
91-
db.logger.Fatalf("%v", errResult)
92+
tb.Fatalf("cannot create test database: %v", errResult)
9293
}
9394
}()
9495

@@ -108,46 +109,47 @@ func newTDB(tb testing.TB, driver, dsn string, opt []Option) *testDB {
108109
defer mu.Unlock()
109110

110111
if db.mode == RunModeDocker {
111-
db.logger.Logf("[%s] using docker test database", db.dsnNoPass)
112-
if errResult = db.createDockerResources(); errResult != nil {
112+
db.logger.Info(ctx, "using docker test database", "dsn", db.dsnNoPass)
113+
if errResult = db.createDockerResources(ctx); errResult != nil {
113114
return nil
114115
}
115116
} else {
116-
db.logger.Logf("[%s] using real test database", db.dsnNoPass)
117+
db.logger.Info(ctx, "using real test database", "dsn", db.dsnNoPass)
117118
}
118119

119-
if errResult = db.createTestDatabase(); errResult != nil {
120-
if err := db.close(); err != nil {
121-
db.logger.Logf("[%s] failed to close test database: %v", db.dsnNoPass, err)
120+
if errResult = db.createTestDatabase(ctx); errResult != nil {
121+
if err := db.close(ctx); err != nil {
122+
db.logger.Info(ctx, "failed to close test database", "dsn", db.dsnNoPass, "error", err)
122123
}
123124
return nil
124125
}
125126

126127
if db.migrationsDir != "" {
127-
if errResult = db.migrationsUp(); errResult != nil {
128+
if errResult = db.migrationsUp(ctx); errResult != nil {
128129
return nil
129130
}
130131
}
131132

132133
tb.Cleanup(func() {
133-
if err := db.close(); err != nil {
134-
db.logger.Logf("[%s] failed to close test database: %v", db.dsnNoPass, err)
134+
ctx := context.Background()
135+
if err := db.close(ctx); err != nil {
136+
db.logger.Info(ctx, "failed to close test database", "dsn", db.dsnNoPass, "error", err)
135137
} else {
136-
db.logger.Logf("[%s] test database closed", db.dsnNoPass)
138+
db.logger.Info(ctx, "test database closed", "dsn", db.dsnNoPass)
137139
}
138140
})
139141

140142
return db
141143
}
142144

143145
// migrationsUp applies migrations to the database.
144-
func (d *testDB) migrationsUp() error {
145-
d.logger.Logf("[%s] migrations up start", d.dsnNoPass)
146-
defer d.logger.Logf("[%s] migrations up end", d.dsnNoPass)
146+
func (d *testDB) migrationsUp(ctx context.Context) error {
147+
d.logger.Info(ctx, "migrations up start", "dsn", d.dsnNoPass)
148+
defer d.logger.Info(ctx, "migrations up end", "dsn", d.dsnNoPass)
147149

148150
dsn := d.url.replaceDatabase(d.databaseName).string(false)
149151

150-
migrator, err := d.MigrateFactory(dsn, d.migrationsDir, d.logger)
152+
migrator, err := d.MigrateFactory(d.t, dsn, d.migrationsDir, d.logger)
151153
if err != nil {
152154
return fmt.Errorf("new migrator: %w", err)
153155
}
@@ -160,10 +162,10 @@ func (d *testDB) migrationsUp() error {
160162
}
161163

162164
// close closes the test database.
163-
func (d *testDB) close() error {
165+
func (d *testDB) close(ctx context.Context) error {
164166
if d.mode != RunModeDocker {
165167
// remove the database created before applying the migrations
166-
d.logger.Logf("[%s] deleting test database %s", d.dsnNoPass, d.databaseName)
168+
d.logger.Info(ctx, "deleting test database", "dsn", d.dsnNoPass, "database", d.databaseName)
167169

168170
dsn := d.url.string(false)
169171
db, err := sql.Open(d.driver, dsn)
@@ -176,35 +178,35 @@ func (d *testDB) close() error {
176178

177179
for _, prepareCleanUp := range d.prepareCleanUp {
178180
if err := prepareCleanUp(db, d.databaseName); err != nil {
179-
d.logger.Logf("[%s] failed to prepare clean up: %v", d.dsnNoPass, err)
181+
d.logger.Info(ctx, "failed to prepare clean up", "dsn", d.dsnNoPass, "error", err)
180182
}
181183
}
182184

183185
if _, err = db.Exec(fmt.Sprintf("DROP DATABASE %s", d.databaseName)); err != nil {
184186
return fmt.Errorf("drop db: %w", err)
185187
}
186188

187-
d.logger.Logf("[%s] test db %s deleted", d.dsnNoPass, d.databaseName)
189+
d.logger.Info(ctx, "test database deleted", "dsn", d.dsnNoPass, "database", d.databaseName)
188190
}
189191

190192
return nil
191193
}
192194

193195
// initDatabase creates a test database or connects to an existing one.
194-
func (d *testDB) createTestDatabase() error {
196+
func (d *testDB) createTestDatabase(ctx context.Context) error {
195197
if d.driver == mongoDriverName {
196198
return nil
197199
}
198200

199-
return d.createSQLDatabase()
201+
return d.createSQLDatabase(ctx)
200202
}
201203

202204
// retryConnect connects to the database with retries.
203-
func (d *testDB) retryConnect(info string, op func() error) error {
205+
func (d *testDB) retryConnect(ctx context.Context, info string, op func() error) error {
204206
var attempt int
205207
operation := func() (struct{}, error) {
206208
if err := op(); err != nil {
207-
d.logger.Logf("[%s] retrying attempt %d: %v", info, attempt, err)
209+
d.logger.Info(ctx, "retrying operation", "info", info, "attempt", attempt, "error", err)
208210
attempt++
209211
return struct{}{}, err
210212
}

docker.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ type dockerResourceInfo struct {
2929
}
3030

3131
// createDockerResources create a pool and a resource for creating a test database in docker.
32-
func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
32+
func (d *testDB) createDockerResources(ctx context.Context) error { //nolint:gocognit // ok
3333
globalDockerMu.Lock()
3434

3535
info, ok := globalDockerResources[d.dsn]
@@ -60,7 +60,7 @@ func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
6060
}
6161
for _, env := range proxyEnv {
6262
if os.Getenv(env) != "" {
63-
d.logger.Logf("dockertest unset proxy env %s", env)
63+
d.logger.Info(ctx, "unset proxy env", "component", "docker", "env", env)
6464
_ = os.Unsetenv(env)
6565
}
6666
}
@@ -72,15 +72,15 @@ func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
7272
return fmt.Errorf("dockertest ping: %w", err)
7373
}
7474

75-
d.logger.Logf("dockertest pool created")
75+
d.logger.Info(ctx, "pool created", "component", "docker")
7676

7777
defer func() {
7878
globalDockerMu.Lock()
7979
defer globalDockerMu.Unlock()
8080

8181
if len(globalDockerResources) == 0 {
8282
globalDockerPool = nil
83-
d.logger.Logf("dockertest pool purged")
83+
d.logger.Info(ctx, "pool purged", "component", "docker")
8484
}
8585
}()
8686
}
@@ -134,7 +134,7 @@ func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
134134
}
135135
if needNextPort {
136136
// increase hostPort by 1
137-
d.logger.Logf("[%s] port is already allocated, try next port %d", logDsn, d.url.Port+1)
137+
d.logger.Info(ctx, "port is already allocated, trying next port", "dsn", logDsn, "next_port", d.url.Port+1)
138138
d.url.Port++
139139
continue
140140
}
@@ -144,8 +144,7 @@ func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
144144
break
145145
}
146146

147-
d.logger.Logf("[%s] dockertest RunWithOptions failed, attempt %d, error %v",
148-
logDsn, attempt, err)
147+
d.logger.Info(ctx, "RunWithOptions failed", "component", "docker", "dsn", logDsn, "attempt", attempt, "error", err)
149148
time.Sleep(sleepTime)
150149
}
151150

@@ -155,11 +154,11 @@ func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
155154

156155
info.port = d.url.Port
157156

158-
d.logger.Logf("[%s] dockertest resources created", logDsn)
157+
d.logger.Info(ctx, "resources created", "component", "docker", "dsn", logDsn)
159158
} else {
160159
d.url.Port = info.port // restore port
161160

162-
d.logger.Logf("[%s] dockertest using existing resources", logDsn)
161+
d.logger.Info(ctx, "use existing resources", "component", "docker", "dsn", logDsn)
163162
}
164163

165164
globalDockerMu.Lock()
@@ -169,6 +168,8 @@ func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
169168
info.count++
170169

171170
d.t.Cleanup(func() {
171+
ctx := context.Background()
172+
172173
info.mu.Lock()
173174
defer info.mu.Unlock()
174175
info.count--
@@ -188,19 +189,19 @@ func (d *testDB) createDockerResources() error { //nolint:gocognit // ok
188189
operation := func() (struct{}, error) {
189190
if err := globalDockerPool.Purge(info.resource); err != nil {
190191
attempt++
191-
d.logger.Logf("[%s] dockertest purge attempt %d failed: %v", logDsn, attempt, err)
192+
// Closure needs access to context, so we'll pass background context since this is a cleanup function
193+
d.logger.Info(ctx, "purge attempt failed", "component", "docker", "dsn", logDsn, "attempt", attempt, "error", err)
192194
return struct{}{}, err
193195
}
194196
return struct{}{}, nil
195197
}
196198

197-
if _, err := backoff.Retry(
198-
context.Background(), operation,
199+
if _, err := backoff.Retry(ctx, operation,
199200
backoff.WithBackOff(backoff.NewConstantBackOff(retryTimeout)),
200201
backoff.WithMaxElapsedTime(maxTime)); err != nil {
201-
d.logger.Logf("[%s] dockertest purge failed after retries attempt %d: %v", logDsn, attempt, err)
202+
d.logger.Info(ctx, "purge failed after retries", "component", "docker", "dsn", logDsn, "attempt", attempt, "error", err)
202203
} else {
203-
d.logger.Logf("[%s] dockertest resources purged successfully after %d attempts", logDsn, attempt)
204+
d.logger.Info(ctx, "resources purged successfully", "component", "docker", "dsn", logDsn, "attempts", attempt)
204205
}
205206
}
206207
})

go.mod

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ require (
1010
github.com/google/uuid v1.6.0
1111
github.com/jackc/pgx/v5 v5.7.2
1212
github.com/lib/pq v1.10.9
13+
github.com/n-r-w/ctxlog v0.0.0-20250125225454-e40a4b2678d2
1314
github.com/ory/dockertest/v3 v3.11.0
1415
github.com/pressly/goose/v3 v3.24.1
1516
github.com/stretchr/testify v1.10.0
@@ -29,6 +30,8 @@ require (
2930
github.com/docker/docker v27.2.0+incompatible // indirect
3031
github.com/docker/go-connections v0.5.0 // indirect
3132
github.com/docker/go-units v0.5.0 // indirect
33+
github.com/go-logr/logr v1.4.2 // indirect
34+
github.com/go-logr/stdr v1.2.2 // indirect
3235
github.com/gogo/protobuf v1.3.2 // indirect
3336
github.com/golang/snappy v0.0.4 // indirect
3437
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
@@ -50,15 +53,24 @@ require (
5053
github.com/pmezard/go-difflib v1.0.0 // indirect
5154
github.com/sethvargo/go-retry v0.3.0 // indirect
5255
github.com/sirupsen/logrus v1.9.3 // indirect
56+
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2 // indirect
57+
github.com/uptrace/opentelemetry-go-extra/otelzap v0.2.4 // indirect
5358
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
5459
github.com/xdg-go/scram v1.1.2 // indirect
5560
github.com/xdg-go/stringprep v1.0.4 // indirect
5661
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
5762
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
5863
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
5964
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
65+
go.opentelemetry.io/otel v1.30.0 // indirect
66+
go.opentelemetry.io/otel/log v0.6.0 // indirect
67+
go.opentelemetry.io/otel/metric v1.30.0 // indirect
68+
go.opentelemetry.io/otel/trace v1.30.0 // indirect
6069
go.uber.org/atomic v1.7.0 // indirect
70+
go.uber.org/mock v0.5.0 // indirect
6171
go.uber.org/multierr v1.11.0 // indirect
72+
go.uber.org/zap v1.27.0 // indirect
73+
go.uber.org/zap/exp v0.3.0 // indirect
6274
golang.org/x/crypto v0.31.0 // indirect
6375
golang.org/x/sync v0.10.0 // indirect
6476
golang.org/x/sys v0.28.0 // indirect

go.sum

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
3939
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
4040
github.com/georgysavva/scany/v2 v2.1.3 h1:Zd4zm/ej79Den7tBSU2kaTDPAH64suq4qlQdhiBeGds=
4141
github.com/georgysavva/scany/v2 v2.1.3/go.mod h1:fqp9yHZzM/PFVa3/rYEC57VmDx+KDch0LoqrJzkvtos=
42+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
4243
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
4344
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
4445
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -98,6 +99,8 @@ github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8
9899
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
99100
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
100101
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
102+
github.com/n-r-w/ctxlog v0.0.0-20250125225454-e40a4b2678d2 h1:WVspw5P7bIWGWt11IUgc+vgVZhAdo70rZmspWomQ1sM=
103+
github.com/n-r-w/ctxlog v0.0.0-20250125225454-e40a4b2678d2/go.mod h1:5Xdj8edMhFfuan/+KiKcWWPeQooTcRnzhh8+bxEmZ94=
101104
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
102105
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
103106
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -129,6 +132,10 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
129132
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
130133
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
131134
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
135+
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2 h1:3/aHKUq7qaFMWxyQV0W2ryNgg8x8rVeKVA20KJUkfS0=
136+
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2/go.mod h1:Zit4b8AQXaXvA68+nzmbyDzqiyFRISyw1JiD5JqUBjw=
137+
github.com/uptrace/opentelemetry-go-extra/otelzap v0.2.4 h1:/4mU8NB88+6u9JVKlkdD6HjrhRM1V1KRTsJaU8FSr8I=
138+
github.com/uptrace/opentelemetry-go-extra/otelzap v0.2.4/go.mod h1:JoL6Kg6zYo9WtK5Y715GWItSUNpWprRYj5wgO01h00g=
132139
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
133140
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
134141
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
@@ -151,16 +158,28 @@ go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793Sqyh
151158
go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
152159
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
153160
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
154-
go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
155-
go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
156-
go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
157-
go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
158-
go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
159-
go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
161+
go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts=
162+
go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc=
163+
go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8=
164+
go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM=
165+
go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w=
166+
go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ=
167+
go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo=
168+
go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok=
169+
go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc=
170+
go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o=
160171
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
161172
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
173+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
174+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
175+
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
176+
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
162177
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
163178
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
179+
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
180+
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
181+
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
182+
go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ=
164183
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
165184
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
166185
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=

0 commit comments

Comments
 (0)