2024-12
<- 2024-11
-> 2025-01
2024-12-31
年末です 2024 ふりかえり
2024-12-30
buf の lsp 使ってる
タイプ毎に(debounce してそうとはいえ) indexing が走ってるんすけど……
2024-12-29
DIALOGUE+3
2024-12-26
(ここに怒りの画像を貼る)
2024-12-23
go test が重い
というか go build が重い
2024-12-17
Db | OpenTelemetry のdb.query.summary,無理だと思う
正規表現使ってなんとかどうにかした
https://scrapbox.io/files/676185139bd4336aed3a4c59.png
2024-12-11
全く書いてないしいらないんじゃないかという気がしてきました
2023-12#656f2eac1565b30000c89cc3 から一年経ってて寂しいよ
最近はひたすら Go アプリケーションの基盤整備的なことをしているが
今日は DB をテストする回
気持ちとしては可能な限りモックを使いたくないので,効率的に DB を使ったテストができると最高
go testで動いてほしい
t.Parallelしてもうまく,かつ高速に動いてほしい
最終的に Testcontainers + DATA-DOG/go-txdb になった
Testcontainers は実際に DB を起動する
txdb の後ろで動かすためや,pgx.Connが必要などの何らかの理由で本物の DB が必要という場面で使う
コンテナなので実際重く,ローカルで起動したくはなるがバージョン固定とかがしんどいので採用した
実際にはCREATE DATABASEすればいいのでインスタンスは1つでいいはずだが,Go のテストはパッケージごとに別プロセスとして実行されるのでこれらを共有するのは難しい
闇のプロセス間通信をすれば可能だとは思うけどできたとしてライフサイクルの管理などの問題が発生する
TestMainの全体版が欲しいけど,fork してるわけじゃない(Go のランタイムは fork をサポートしてない)からどういう I/F にするのかから厄介そう
txdb はトランザクションを使って仮想的にベースの DB を shallow copy した DB を作り出す
新たなsql.DBインスタンスが要求されたとき,ベースの DB 上でトランザクションを開始する
終了するときにトランザクションをロールバックする
(仮想的な)トランザクションはセーブポイントの機能を使って実現している
テストごとに DB を分離するのに使う
類似のものとして kanmu/pgtxdb が存在する
txdb より早い段階で仮想トランザクションの機能をサポートしていたが,txdb も実装しているので機能上の差異はほとんどないように見える
セーブポイントを使ったトランザクションの実装に差異がある
txdb はトランザクションのコミット時にセーブポイントを開放しているが,pgtxdb は何もしていない
開放したほうが誤ったロールバックを防げるので良さそうに見える
DB を計装したい
要件としては
ドライバーのコネクション(pgx.Conn など)が取り出せる
OpenTelemetry Semantic Convension に従っていてほしい
Semantic Conventions for SQL Databases | OpenTelemetry
db.query.summaryとか難しいけど……
だいたい2つ実装がある
github.com/uptrace/opentelemetry-go-extra/otelsqlとgithub.com/XSAM/otelsql
conn.Raw()をサポートしてるのはXSAM/otelsqlのほうだけなので選択肢がない
ちなみにどっちも semconv のサポートはあんまりです