Skip to content

Commit 21035c5

Browse files
committed
fixed ydb_go_sdk_ydb_database_sql_conns metric + added integration test for check metric
1 parent 43cd76c commit 21035c5

File tree

8 files changed

+134
-9
lines changed

8 files changed

+134
-9
lines changed

internal/xslices/keys.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package xslices
2+
3+
import (
4+
"cmp"
5+
"slices"
6+
)
7+
8+
func Keys[Key cmp.Ordered, T any](m map[Key]T) []Key {
9+
keys := make([]Key, 0, len(m))
10+
11+
for key := range m {
12+
keys = append(keys, key)
13+
}
14+
15+
slices.Sort(keys)
16+
17+
return keys
18+
}

internal/xslices/keys_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package xslices
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
)
8+
9+
func TestKeys(t *testing.T) {
10+
require.Equal(t, []string{"1", "2"}, Keys(map[string]any{
11+
"1": nil,
12+
"2": nil,
13+
}))
14+
require.Equal(t, []int{1, 2}, Keys(map[int]any{
15+
1: nil,
16+
2: nil,
17+
}))
18+
}

internal/xsql/connector.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/ydb-platform/ydb-go-sdk/v3/internal/bind"
1616
"github.com/ydb-platform/ydb-go-sdk/v3/internal/query"
17+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/stack"
1718
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext"
1819
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
1920
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsql/legacy"
@@ -123,10 +124,17 @@ func (c *Connector) Open(name string) (driver.Conn, error) {
123124
return nil, xerrors.WithStackTrace(driver.ErrSkip)
124125
}
125126

126-
func (c *Connector) Connect(ctx context.Context) (driver.Conn, error) {
127+
func (c *Connector) Connect(ctx context.Context) (_ driver.Conn, finalErr error) { //nolint:funlen
128+
onDone := trace.DatabaseSQLOnConnectorConnect(c.Trace(), &ctx,
129+
stack.FunctionID("", stack.Package("database/sql")),
130+
)
131+
127132
switch c.processor {
128133
case QUERY_SERVICE:
129134
s, err := query.CreateSession(ctx, c.Query())
135+
defer func() {
136+
onDone(s, finalErr)
137+
}()
130138
if err != nil {
131139
return nil, xerrors.WithStackTrace(err)
132140
}
@@ -152,6 +160,9 @@ func (c *Connector) Connect(ctx context.Context) (driver.Conn, error) {
152160

153161
case LEGACY:
154162
s, err := c.Table().CreateSession(ctx) //nolint:staticcheck
163+
defer func() {
164+
onDone(s, finalErr)
165+
}()
155166
if err != nil {
156167
return nil, xerrors.WithStackTrace(err)
157168
}

metrics/sql.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package metrics
22

33
import (
4-
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
54
"time"
65

6+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
77
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
88
)
99

10-
// databaseSQL makes trace.DatabaseSQL with measuring `database/sql` events
10+
// DatabaseSQL makes trace.DatabaseSQL with measuring `database/sql` events
1111
//
1212
//nolint:funlen
13-
func databaseSQL(config Config) trace.DatabaseSQL {
13+
func DatabaseSQL(config Config) trace.DatabaseSQL {
1414
config = config.WithSystem("database").WithSystem("sql")
1515

1616
conns := config.GaugeVec("conns")

metrics/traces.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func WithTraces(config Config) ydb.Option {
1919
ydb.WithTraceCoordination(coordination(config)),
2020
ydb.WithTraceRatelimiter(ratelimiter(config)),
2121
ydb.WithTraceDiscovery(discovery(config)),
22-
ydb.WithTraceDatabaseSQL(databaseSQL(config)),
22+
ydb.WithTraceDatabaseSQL(DatabaseSQL(config)),
2323
ydb.WithTraceRetry(retry(config)),
2424
)
2525
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
//go:build integration
2+
// +build integration
3+
4+
package integration
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
"github.com/stretchr/testify/require"
11+
12+
"github.com/ydb-platform/ydb-go-sdk/v3"
13+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xslices"
14+
"github.com/ydb-platform/ydb-go-sdk/v3/metrics"
15+
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
16+
)
17+
18+
func TestDatabaseSqlMetrics(t *testing.T) {
19+
ctx, cancel := context.WithCancel(context.Background())
20+
defer cancel()
21+
22+
var (
23+
scope = newScope(t)
24+
registry = &registryConfig{
25+
details: trace.DatabaseSQLEvents,
26+
gauges: newVec[gaugeVec](),
27+
counters: newVec[counterVec](),
28+
timers: newVec[timerVec](),
29+
histograms: newVec[histogramVec](),
30+
}
31+
db = scope.SQLDriver(ydb.WithDatabaseSQLTrace(metrics.DatabaseSQL(registry)))
32+
)
33+
34+
require.Equal(t,
35+
[]string{"database.sql.conns{}", "database.sql.tx{}"},
36+
xslices.Keys(registry.gauges.data),
37+
)
38+
require.EqualValues(t, 1, registry.gauges.data["database.sql.conns{}"].gauges["database.sql.conns{}"].value)
39+
40+
cc1, err := db.Conn(ctx)
41+
require.NoError(t, err)
42+
require.NotNil(t, cc1)
43+
require.EqualValues(t, 1, registry.gauges.data["database.sql.conns{}"].gauges["database.sql.conns{}"].value)
44+
require.Empty(t, registry.gauges.data["database.sql.tx{}"].gauges)
45+
46+
cc2, err := db.Conn(ctx)
47+
require.NoError(t, err)
48+
require.NotNil(t, cc2)
49+
require.EqualValues(t, 2, registry.gauges.data["database.sql.conns{}"].gauges["database.sql.conns{}"].value)
50+
require.Empty(t, registry.gauges.data["database.sql.tx{}"].gauges)
51+
52+
tx1, err := cc1.BeginTx(ctx, nil)
53+
require.NoError(t, err)
54+
require.NotNil(t, tx1)
55+
require.NotEmpty(t, registry.gauges.data["database.sql.tx{}"].gauges)
56+
require.EqualValues(t, 1, registry.gauges.data["database.sql.tx{}"].gauges["database.sql.tx{}"].value)
57+
58+
require.NoError(t, tx1.Commit())
59+
require.EqualValues(t, 0, registry.gauges.data["database.sql.tx{}"].gauges["database.sql.tx{}"].value)
60+
61+
require.NoError(t, cc1.Close())
62+
require.EqualValues(t, 2, registry.gauges.data["database.sql.conns{}"].gauges["database.sql.conns{}"].value)
63+
64+
tx2, err := cc2.BeginTx(ctx, nil)
65+
require.NoError(t, err)
66+
require.NotNil(t, tx2)
67+
require.NotEmpty(t, registry.gauges.data["database.sql.tx{}"].gauges)
68+
require.EqualValues(t, 1, registry.gauges.data["database.sql.tx{}"].gauges["database.sql.tx{}"].value)
69+
70+
require.NoError(t, tx2.Rollback())
71+
require.EqualValues(t, 0, registry.gauges.data["database.sql.tx{}"].gauges["database.sql.tx{}"].value)
72+
73+
require.NoError(t, cc2.Close())
74+
require.EqualValues(t, 2, registry.gauges.data["database.sql.conns{}"].gauges["database.sql.conns{}"].value)
75+
76+
require.NoError(t, db.Close())
77+
require.EqualValues(t, 0, registry.gauges.data["database.sql.conns{}"].gauges["database.sql.conns{}"].value)
78+
}

trace/sql.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ type (
7777
}
7878
// Internals: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#internals
7979
DatabaseSQLConnectorConnectDoneInfo struct {
80-
Error error
8180
Session sessionInfo
81+
Error error
8282
}
8383
// Internals: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#internals
8484
DatabaseSQLConnPingStartInfo struct {

trace/sql_gtrace.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)