diff --git a/doc.go b/doc.go index bc0391dd..8ca07eda 100644 --- a/doc.go +++ b/doc.go @@ -175,7 +175,7 @@ notification is received or the context is canceled. Tracing and Logging -pgx supports tracing by setting ConnConfig.Tracer. +pgx supports tracing by setting ConnConfig.Tracer. To combine several tracers you can use the MultiTracer. In addition, the tracelog package provides the TraceLog type which lets a traditional logger act as a Tracer. diff --git a/tracer.go b/tracer.go index 8d3fb12e..13c1f8ee 100644 --- a/tracer.go +++ b/tracer.go @@ -105,6 +105,8 @@ type TraceConnectEndData struct { Err error } +// MultiTracer can combine several tracers into one. +// You can use NewMultiTracer to automatically split tracers by interface. type MultiTracer struct { QueryTracers []QueryTracer BatchTracers []BatchTracer @@ -113,6 +115,7 @@ type MultiTracer struct { ConnectTracers []ConnectTracer } +// NewMultiTracer returns new MultiTracer from tracers with automatically split tracers by interface. func NewMultiTracer(tracers ...QueryTracer) *MultiTracer { var t MultiTracer diff --git a/tracer_test.go b/tracer_test.go index a0fea71e..82e4d386 100644 --- a/tracer_test.go +++ b/tracer_test.go @@ -566,3 +566,51 @@ func TestTraceConnect(t *testing.T) { require.True(t, traceConnectStartCalled) require.True(t, traceConnectEndCalled) } + +type testCopyTracer struct{} + +func (tt *testCopyTracer) TraceQueryStart(ctx context.Context, conn *pgx.Conn, data pgx.TraceQueryStartData) context.Context { + return ctx +} + +func (tt *testCopyTracer) TraceQueryEnd(ctx context.Context, conn *pgx.Conn, data pgx.TraceQueryEndData) { +} + +func (tt *testCopyTracer) TraceCopyFromStart(ctx context.Context, conn *pgx.Conn, data pgx.TraceCopyFromStartData) context.Context { + return ctx +} + +func (tt *testCopyTracer) TraceCopyFromEnd(ctx context.Context, conn *pgx.Conn, data pgx.TraceCopyFromEndData) { +} + +func TestNewMultiTracer(t *testing.T) { + t.Parallel() + + fullTracer := &testTracer{} + copyTracer := &testCopyTracer{} + + mt := pgx.NewMultiTracer(fullTracer, copyTracer) + require.Equal( + t, + &pgx.MultiTracer{ + QueryTracers: []pgx.QueryTracer{ + fullTracer, + copyTracer, + }, + BatchTracers: []pgx.BatchTracer{ + fullTracer, + }, + CopyFromTracers: []pgx.CopyFromTracer{ + fullTracer, + copyTracer, + }, + PrepareTracers: []pgx.PrepareTracer{ + fullTracer, + }, + ConnectTracers: []pgx.ConnectTracer{ + fullTracer, + }, + }, + mt, + ) +}