sqltrace
一个低代码侵入的SQL 链路追踪库,适用于任何关系数据库(Sqlite3、 MySQL、 Oracle、 SQL Server、 PostgreSQL、TiDB等)和各种关系型数据库的ORM库(gorm、xorm、 sqlx等)
😜安装
go get -u github.com/chenquan/sqltrace
👏如何使用它
原生
package main
import (
"context"
"database/sql"
"fmt"
"github.com/chenquan/sqltrace"
"github.com/mattn/go-sqlite3"
_ "github.com/mattn/go-sqlite3"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
)
func main() {
// Create a sqlite3 driver with link tracking
driver := sqltrace.NewDriver(sqltrace.Config{
Name: "sqlite3_trace",
DataSourceName: "sqlite3",
Endpoint: "http://localhost:14268/api/traces",
Sampler: 1,
Batcher: "jaeger",
}, &sqlite3.SQLiteDriver{})
defer sqltrace.StopAgent()
// register new driver
sql.Register("sqlite3_trace", driver)
// open database
db, err := sql.Open("sqlite3_trace", "identifier.sqlite")
if err != nil {
panic(err)
}
tracer := otel.GetTracerProvider().Tracer("sqlite3_trace")
ctx, span := tracer.Start(context.Background(),
"test",
trace.WithSpanKind(trace.SpanKindClient),
)
defer span.End()
db.ExecContext(ctx, `CREATE TABLE t
(
age integer,
name TEXT
)`)
db.ExecContext(ctx, "insert into t values (?,?)", 1, "chenquan")
// transaction
tx, err := db.BeginTx(ctx, nil)
stmt, err := tx.PrepareContext(ctx, "select age+1 as age,name from t where age = ?;")
stmt.QueryContext(ctx, 1)
tx.Commit()
rows, err := db.QueryContext(ctx, "select age+1 as age,name from t;")
for rows.Next() {
var age int
var name string
err := rows.Scan(&age, &name)
if err != nil {
fmt.Println(err)
}
fmt.Println(age, name)
}
}
gorm
package main
import (
"context"
"database/sql"
"fmt"
"github.com/chenquan/sqltrace"
"github.com/mattn/go-sqlite3"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func main() {
// Create a sqlite3 driver with link tracking
driver := sqltrace.NewDriver(sqltrace.Config{
Name: "sqlite3_trace",
DataSourceName: "sqlite3",
Endpoint: "http://localhost:14268/api/traces",
Sampler: 1,
Batcher: "jaeger",
}, &sqlite3.SQLiteDriver{})
defer sqltrace.StopAgent()
// register new driver
sql.Register("sqlite3_trace", driver)
db, err := gorm.Open(sqlite.Dialector{
DriverName: "sqlite3_trace",
DSN: "identifier.sqlite",
}, &gorm.Config{})
if err != nil {
panic(err)
}
tracer := otel.GetTracerProvider().Tracer("sqlite3_trace")
ctx, span := tracer.Start(context.Background(),
"test",
trace.WithSpanKind(trace.SpanKindClient),
)
defer span.End()
type T struct {
Age int `db:"age"`
Name string `db:"name"`
}
db = db.WithContext(ctx)
db.Migrator().AutoMigrate(&T{})
db.Create(&T{
Age: 1,
Name: "chenquan",
})
rows, err := db.Raw("select age+1 as age,name from ts;").Rows()
if err != nil {
panic(err)
}
for rows.Next() {
var age int
var name string
err := rows.Scan(&age, &name)
if err != nil {
fmt.Println(err)
}
fmt.Println(age, name)
}
db.Commit()
}
如果您喜欢或正在使用这个项目来学习或开始您的解决方案,请给它一个星⭐。谢谢!