diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f7b4abf..6fc3484 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -14,9 +14,8 @@ jobs: strategy: matrix: go-version: - - "1.22" - - "1.23" - - "1.24" + - "1.25" + - "1.26" steps: - uses: actions/checkout@v3 @@ -30,3 +29,8 @@ jobs: - name: Run tests run: make test + + - name: golangci-lint + uses: golangci/golangci-lint-action@v9 + with: + version: v2.12 diff --git a/.gitignore b/.gitignore index e5452e1..b2fb310 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ + +.claude/* diff --git a/Makefile b/Makefile index 9e0e1d9..914bd24 100644 --- a/Makefile +++ b/Makefile @@ -8,12 +8,8 @@ test: vet .PHONY: lint lint: - golint ./... + golangci-lint run ./... .PHONY: vet vet: - $(GO) vet ./... - -.PHONY: deps -deps: - go get -u golang.org/x/lint/golint \ No newline at end of file + $(GO) vet ./... \ No newline at end of file diff --git a/go.mod b/go.mod index 4cfe0eb..242aa7f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,8 @@ module github.com/exaring/otelpgx go 1.25.0 require ( - github.com/jackc/pgx/v5 v5.7.4 + github.com/jackc/pgx/v5 v5.9.2 + github.com/stretchr/testify v1.11.1 go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/metric v1.43.0 go.opentelemetry.io/otel/sdk v1.43.0 @@ -12,15 +13,17 @@ require ( require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/sync v0.10.0 // indirect + golang.org/x/sync v0.17.0 // indirect golang.org/x/sys v0.42.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/text v0.29.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 3f1142d..8f18f19 100644 --- a/go.sum +++ b/go.sum @@ -16,12 +16,18 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= -github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -41,15 +47,15 @@ go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09 go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tracer_benchmark_test.go b/tracer_benchmark_test.go index 48fad83..fb3a86f 100644 --- a/tracer_benchmark_test.go +++ b/tracer_benchmark_test.go @@ -10,6 +10,7 @@ import ( "github.com/exaring/otelpgx" "github.com/jackc/pgx/v5/pgxpool" + "github.com/stretchr/testify/require" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/sdk/trace/tracetest" ) @@ -23,18 +24,14 @@ func BenchmarkTracer(b *testing.B) { } ctx := context.Background() config, err := pgxpool.ParseConfig(dsn) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err, "parse pgx pool config") tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithBatcher(tracetest.NewNoopExporter()), sdktrace.WithSampler(sdktrace.AlwaysSample()), ) config.ConnConfig.Tracer = otelpgx.NewTracer(otelpgx.WithTracerProvider(tracerProvider)) pool, err := pgxpool.NewWithConfig(ctx, config) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err, "create pgx pool") b.Cleanup(pool.Close) tracer := tracerProvider.Tracer("otelpgx") @@ -46,15 +43,11 @@ func BenchmarkTracer(b *testing.B) { b.ReportAllocs() for b.Loop() { tx, err := pool.Begin(ctx) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err, "begin transaction") if err := tx.QueryRow(ctx, query).Scan(&maxConns); err != nil { _ = tx.Rollback(ctx) b.Fatal(err) } - if err := tx.Rollback(ctx); err != nil { - b.Fatal(err) - } + require.NoError(b, tx.Rollback(ctx), "rollback transaction") } } diff --git a/tracer_test.go b/tracer_test.go index 25595f0..96eb9d8 100644 --- a/tracer_test.go +++ b/tracer_test.go @@ -4,6 +4,8 @@ import ( "context" "strings" "testing" + + "github.com/stretchr/testify/assert" ) func TestTracer_sqlOperationName(t *testing.T) { @@ -88,10 +90,7 @@ func TestTracer_sqlOperationName(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tr := tt.tracer - if got := tr.spanNameCtxFunc(context.TODO(), tt.query); got != tt.expName { - t.Errorf("Tracer.sqlOperationName() = %v, want %v", got, tt.expName) - } + assert.Equal(t, tt.expName, tt.tracer.spanNameCtxFunc(context.TODO(), tt.query)) }) } } @@ -139,9 +138,11 @@ var testSpanNameFunc SpanNameFunc = func(query string) string { return sqlOperationUnknown } +type spanNameCtxKey struct{} + func TestTracer_sqlOperationNameFromCtx(t *testing.T) { spanNameCtxFunc := func(ctx context.Context, query string) string { - if v := ctx.Value("spanName"); v != nil { + if v := ctx.Value(spanNameCtxKey{}); v != nil { if name, ok := v.(string); ok && name != "" { return name } @@ -157,7 +158,7 @@ func TestTracer_sqlOperationNameFromCtx(t *testing.T) { }{ { desc: "With span name in context", - ctx: context.WithValue(context.TODO(), "spanName", "MyCustomSpanName"), + ctx: context.WithValue(context.TODO(), spanNameCtxKey{}, "MyCustomSpanName"), exp: "MyCustomSpanName", }, { @@ -168,9 +169,7 @@ func TestTracer_sqlOperationNameFromCtx(t *testing.T) { } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { - if got := tracer.spanNameCtxFunc(tt.ctx, "SELECT * FROM users"); got != tt.exp { - t.Errorf("Tracer.sqlOperationName() = %v, want %v", got, tt.exp) - } + assert.Equal(t, tt.exp, tracer.spanNameCtxFunc(tt.ctx, "SELECT * FROM users")) }) } }