Getting started with otelsql, the OpenTelemetry instrumentation for Go SQL | OpenTelemetry

driverをラップする系

sqlx などのラッパーライブラリと組み合わせることも簡単。

package main
 
import (
	_ "github.com/lib/pq"
	"github.com/jmoiron/sqlx"
	semconv "go.opentelemetry.io/otel/semconv/v1.27.0"
	"go.nhat.io/otelsql"
)
 
func main(){
    // ...
	driverName, err := otelsql.Register("mysql",
		otelsql.AllowRoot(),
		otelsql.TraceQueryWithoutArgs(),
		otelsql.TraceRowsClose(),
		otelsql.TraceRowsAffected(),
		otelsql.WithDatabaseName(dbname),     // Optional.
		otelsql.WithSystem(semconv.DBSystemMySQL), // Optional.
	)
	if err != nil {
		panic(err)
	}
	sqlxDb, err := sqlx.Open(driverName, dsn)
	if err != nil {
		panic(err)
	}
    // ...
}
 

sql.Openを置き換える系

こちらも修正は容易で、 sql.Openotelsql.Open に変えるだけである

// github.com/XSAM/otelsql の場合
db, err := otelsql.Open("mysql", mysqlDSN, otelsql.WithAttributes(
	semconv.DBSystemMySQL,
))
if err != nil {
	panic(err)
}
defer db.Close()
 
// metricsを収集したい場合
err = otelsql.RegisterDBStatsMetrics(db, otelsql.WithAttributes(
	semconv.DBSystemMySQL,
))
if err != nil {
	panic(err)
}
 
sqlxDb := sqlx.NewDb(sqlDb, "mysql")
// github.com/uptrace/opentelemetry-go-extra/otelsqlx の場合
db, err := otelsqlx.Open("mysql", mysqlDSN,
    otelsql.WithAttributes(semconv.DBSystemMySQL),
    otelsql.WithDBName("mydb"),
)
if err != nil {
	panic(err)
}
defer db.Close()