一个低代码侵入的SQL 链路追踪库,适用于任何关系数据库和各种关系型数据库的ORM库

190 阅读1分钟

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)
	}
}

image.png

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()
}

image.png

如果您喜欢或正在使用这个项目来学习或开始您的解决方案,请给它一个星⭐。谢谢!