61 lines
2.0 KiB
Go
61 lines
2.0 KiB
Go
// Package sql provides functions to trace the database/sql package (https://golang.org/pkg/database/sql).
|
|
// It will automatically augment operations such as connections, statements and transactions with tracing.
|
|
//
|
|
// We start by telling the package which driver we will be using. For example, if we are using "github.com/lib/pq",
|
|
// we would do as follows:
|
|
//
|
|
// sqltrace.Register("pq", pq.Driver{})
|
|
// db, err := sqltrace.Open("pq", "postgres://pqgotest:password@localhost...")
|
|
//
|
|
// The rest of our application would continue as usual, but with tracing enabled.
|
|
//
|
|
package sql
|
|
|
|
import (
|
|
"database/sql"
|
|
"database/sql/driver"
|
|
"errors"
|
|
)
|
|
|
|
// Register tells the sql integration package about the driver that we will be tracing. It must
|
|
// be called before Open, if that connection is to be traced. It uses the driverName suffixed
|
|
// with ".db" as the default service name.
|
|
func Register(driverName string, driver driver.Driver, opts ...RegisterOption) {
|
|
if driver == nil {
|
|
panic("sqltrace: Register driver is nil")
|
|
}
|
|
name := tracedDriverName(driverName)
|
|
if driverExists(name) {
|
|
// no problem, carry on
|
|
return
|
|
}
|
|
cfg := new(registerConfig)
|
|
defaults(cfg)
|
|
for _, fn := range opts {
|
|
fn(cfg)
|
|
}
|
|
if cfg.serviceName == "" {
|
|
cfg.serviceName = driverName + ".db"
|
|
}
|
|
sql.Register(name, &tracedDriver{
|
|
Driver: driver,
|
|
driverName: driverName,
|
|
config: cfg,
|
|
})
|
|
}
|
|
|
|
// errNotRegistered is returned when there is an attempt to open a database connection towards a driver
|
|
// that has not previously been registered using this package.
|
|
var errNotRegistered = errors.New("sqltrace: Register must be called before Open")
|
|
|
|
// Open returns connection to a DB using a the traced version of the given driver. In order for Open
|
|
// to work, the driver must first be registered using Register or RegisterWithServiceName. If this
|
|
// did not occur, Open will return an error.
|
|
func Open(driverName, dataSourceName string) (*sql.DB, error) {
|
|
name := tracedDriverName(driverName)
|
|
if !driverExists(name) {
|
|
return nil, errNotRegistered
|
|
}
|
|
return sql.Open(name, dataSourceName)
|
|
}
|