Skip to content

Commit c881d66

Browse files
authored
Fix scan type for nullable digests and digest texts (#3993)
1 parent d0f0c30 commit c881d66

File tree

2 files changed

+61
-5
lines changed

2 files changed

+61
-5
lines changed

‎internal/component/database_observability/mysql/collector/locks.go‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func (c *LockCollector) fetchLocks(ctx context.Context) error {
144144

145145
for rsdl.Next() {
146146
var waitingTimerWait, waitingLockTime, blockingTimerWait, blockingLockTime float64
147-
var waitingDigest, waitingDigestText, blockingDigest, blockingDigestText string
147+
var waitingDigest, waitingDigestText, blockingDigest, blockingDigestText sql.NullString
148148

149149
err := rsdl.Scan(&waitingTimerWait, &waitingLockTime, &waitingDigest, &waitingDigestText,
150150
&blockingTimerWait, &blockingLockTime, &blockingDigest, &blockingDigestText)
@@ -157,10 +157,10 @@ func (c *LockCollector) fetchLocks(ctx context.Context) error {
157157
if waitingLockTime > secondsToPicoseconds(c.lockTimeThreshold.Seconds()) {
158158
lockMsg := fmt.Sprintf(
159159
`waiting_digest="%s" waiting_digest_text="%s" blocking_digest="%s" blocking_digest_text="%s" waiting_timer_wait="%fms" waiting_lock_time="%fms" blocking_timer_wait="%fms" blocking_lock_time="%fms"`,
160-
waitingDigest,
161-
waitingDigestText,
162-
blockingDigest,
163-
blockingDigestText,
160+
waitingDigest.String,
161+
waitingDigestText.String,
162+
blockingDigest.String,
163+
blockingDigestText.String,
164164
picosecondsToMilliseconds(waitingTimerWait),
165165
picosecondsToMilliseconds(waitingLockTime),
166166
picosecondsToMilliseconds(blockingTimerWait),

‎internal/component/database_observability/mysql/collector/locks_test.go‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,62 @@ func Test_QueryLocks(t *testing.T) {
188188
assert.Equal(t, `level="info" waiting_digest="xyz789" waiting_digest_text="SELECT * FROM orders WHERE user_id = ?" blocking_digest="ghi012" blocking_digest_text="DELETE FROM sessions WHERE expired = ?" waiting_timer_wait="2500.000000ms" waiting_lock_time="2000.000000ms" blocking_timer_wait="3000.000000ms" blocking_lock_time="2700.000000ms"`, lokiEntries[1].Line)
189189
})
190190

191+
t.Run("data lock with null digests and digest texts", func(t *testing.T) {
192+
db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
193+
require.NoError(t, err)
194+
defer db.Close()
195+
196+
lokiClient := fake.NewClient(func() {})
197+
198+
collector, err := NewLock(LockArguments{
199+
DB: db,
200+
InstanceKey: "mysql-db",
201+
CollectInterval: time.Second,
202+
EntryHandler: lokiClient,
203+
Logger: log.NewLogfmtLogger(os.Stderr),
204+
})
205+
require.NoError(t, err)
206+
require.NotNil(t, collector)
207+
208+
mock.ExpectQuery(selectDataLocks).RowsWillBeClosed().WillReturnRows(
209+
sqlmock.NewRows(
210+
[]string{
211+
"waitingTimerWait",
212+
"waitingLockTime",
213+
"waitingDigest",
214+
"waitingDigestText",
215+
"blockingTimerWait",
216+
"blockingLockTime",
217+
"blockingDigest",
218+
"blockingDigestText",
219+
},
220+
).AddRow(
221+
1500000000000,
222+
1000000000000,
223+
nil,
224+
nil,
225+
2000000000000,
226+
1700000000000,
227+
nil,
228+
nil,
229+
),
230+
)
231+
232+
require.NoError(t, collector.Start(t.Context()))
233+
234+
require.Eventually(t, func() bool {
235+
return len(lokiClient.Received()) == 1
236+
}, 2*time.Second, 50*time.Millisecond)
237+
238+
collector.Stop()
239+
lokiClient.Stop()
240+
241+
require.NoError(t, mock.ExpectationsWereMet())
242+
lokiEntries := lokiClient.Received()
243+
assert.Equal(t, model.LabelSet{"job": database_observability.JobName, "op": OP_DATA_LOCKS, "instance": "mysql-db"}, lokiEntries[0].Labels)
244+
assert.Equal(t, `level="info" waiting_digest="" waiting_digest_text="" blocking_digest="" blocking_digest_text="" waiting_timer_wait="1500.000000ms" waiting_lock_time="1000.000000ms" blocking_timer_wait="2000.000000ms" blocking_lock_time="1700.000000ms"`, lokiEntries[0].Line)
245+
})
246+
191247
t.Run("recoverable sql error in selectDataLocks result set", func(t *testing.T) {
192248
db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
193249
require.NoError(t, err)

0 commit comments

Comments
 (0)