Documentation ¶
Overview ¶
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.
Example ¶
package main import ( "log" sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" "github.com/lib/pq" ) func main() { // The first step is to register the driver that we will be using. sqltrace.Register("postgres", &pq.Driver{}) // Followed by a call to Open. db, err := sqltrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") if err != nil { log.Fatal(err) } // Then, we continue using the database/sql package as we normally would, with tracing. rows, err := db.Query("SELECT name FROM users WHERE age=?", 27) if err != nil { log.Fatal(err) } defer rows.Close() }
Output:
Example (Context) ¶
package main import ( "context" "log" sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" "github.com/go-sql-driver/mysql" ) func main() { // Register the driver that we will be using (in this case mysql) under a custom service name. sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName("my-db")) // Open a connection to the DB using the driver we've just registered with tracing. db, err := sqltrace.Open("mysql", "user:password@/dbname") if err != nil { log.Fatal(err) } // Create a root span, giving name, server and resource. span, ctx := tracer.StartSpanFromContext(context.Background(), "my-query", tracer.SpanType(ext.SpanTypeSQL), tracer.ServiceName("my-db"), tracer.ResourceName("initial-access"), ) // Subsequent spans inherit their parent from context. rows, err := db.QueryContext(ctx, "SELECT * FROM city LIMIT 5") if err != nil { log.Fatal(err) } rows.Close() span.Finish(tracer.WithError(err)) }
Output:
Example (DbStats) ¶
package main import ( "log" sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" "github.com/lib/pq" ) func main() { // Register the driver with the WithDBStats option to enable DBStats metric polling sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBStats()) // Followed by a call to Open. db, err := sqltrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") if err != nil { log.Fatal(err) } // Tracing and metric polling is now enabled. Metrics will be submitted to Datadog with the prefix `datadog.tracer.sql` rows, err := db.Query("SELECT name FROM users WHERE age=?", 27) if err != nil { log.Fatal(err) } rows.Close() }
Output:
Example (DbmPropagation) ¶
package main import ( "log" sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" "github.com/lib/pq" ) func main() { // The first step is to set the dbm propagation mode when registering the driver. Note that this can also // be done on sqltrace.Open for more granular control over the feature. sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithDBMPropagation(tracer.DBMPropagationModeFull)) // Followed by a call to Open. db, err := sqltrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") if err != nil { log.Fatal(err) } // Then, we continue using the database/sql package as we normally would, with tracing. rows, err := db.Query("SELECT name FROM users WHERE age=?", 27) if err != nil { log.Fatal(err) } defer rows.Close() }
Output:
Example (Sqlite) ¶
package main import ( "context" "log" sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" sqlite "github.com/mattn/go-sqlite3" ) func main() { // Register the driver that we will be using (in this case Sqlite) under a custom service name. sqltrace.Register("sqlite", &sqlite.SQLiteDriver{}, sqltrace.WithServiceName("sqlite-example")) // Open a connection to the DB using the driver we've just registered with tracing. db, err := sqltrace.Open("sqlite", "./test.db") if err != nil { log.Fatal(err) } // Create a root span, giving name, server and resource. span, ctx := tracer.StartSpanFromContext(context.Background(), "my-query", tracer.SpanType("example"), tracer.ServiceName("sqlite-example"), tracer.ResourceName("initial-access"), ) // Subsequent spans inherit their parent from context. rows, err := db.QueryContext(ctx, "SELECT * FROM city LIMIT 5") if err != nil { log.Fatal(err) } rows.Close() span.Finish(tracer.WithError(err)) }
Output:
Index ¶
- Constants
- func Open(driverName, dataSourceName string, opts ...Option) (*sql.DB, error)
- func OpenDB(c driver.Connector, opts ...Option) *sql.DB
- func Register(driverName string, driver driver.Driver, opts ...RegisterOption)
- func WithSpanTags(ctx context.Context, tags map[string]string) context.Context
- type Option
- func WithAnalytics(on bool) Option
- func WithAnalyticsRate(rate float64) Option
- func WithChildSpansOnly() Option
- func WithCustomTag(key string, value interface{}) Option
- func WithDBMPropagation(mode tracer.DBMPropagationMode) Option
- func WithDBStats() Option
- func WithDSN(name string) Option
- func WithErrorCheck(fn func(err error) bool) Option
- func WithIgnoreQueryTypes(qtypes ...QueryType) Option
- func WithSQLCommentInjection(mode tracer.SQLCommentInjectionMode) Optiondeprecated
- func WithServiceName(name string) Option
- type QueryType
- type RegisterOption
- type TracedConn
Examples ¶
Constants ¶
const ( // QueryTypeConnect is used for Connect traces. QueryTypeConnect QueryType = "Connect" // QueryTypeQuery is used for Query traces. QueryTypeQuery = "Query" // QueryTypePing is used for Ping traces. QueryTypePing = "Ping" // QueryTypePrepare is used for Prepare traces. QueryTypePrepare = "Prepare" // QueryTypeExec is used for Exec traces. QueryTypeExec = "Exec" // QueryTypeBegin is used for Begin traces. QueryTypeBegin = "Begin" // QueryTypeClose is used for Close traces. QueryTypeClose = "Close" // QueryTypeCommit is used for Commit traces. QueryTypeCommit = "Commit" // QueryTypeRollback is used for Rollback traces. QueryTypeRollback = "Rollback" )
Variables ¶
This section is empty.
Functions ¶
func Open ¶
Open returns connection to a DB using the traced version of the given driver. The driver may first be registered using Register. If this did not occur, Open will determine the driver by opening a DB connection and retrieving the driver using (*sql.DB).Driver, before closing it and opening a new, traced connection.
func OpenDB ¶ added in v1.16.0
OpenDB returns connection to a DB using the traced version of the given driver. The driver may first be registered using Register. If this did not occur, OpenDB will determine the driver name based on its type.
Types ¶
type Option ¶ added in v1.16.0
Option represents an option that can be passed to Register, Open or OpenDB.
func WithAnalytics ¶ added in v1.11.0
WithAnalytics enables Trace Analytics for all started spans.
func WithAnalyticsRate ¶ added in v1.11.0
WithAnalyticsRate sets the sampling rate for Trace Analytics events correlated to started spans.
func WithChildSpansOnly ¶ added in v1.35.0
func WithChildSpansOnly() Option
WithChildSpansOnly causes spans to be created only when there is an existing parent span in the Context.
func WithCustomTag ¶ added in v1.42.0
WithCustomTag will attach the value to the span tagged by the key
func WithDBMPropagation ¶ added in v1.44.0
func WithDBMPropagation(mode tracer.DBMPropagationMode) Option
WithDBMPropagation enables injection of tags as sql comments on traced queries. This includes dynamic values like span id, trace id and the sampled flag which can make queries unique for some cache implementations. Use DBMPropagationModeService if this is a concern.
Note that enabling sql comment propagation results in potentially confidential data (service names) being stored in the databases which can then be accessed by other 3rd parties that have been granted access to the database.
func WithDBStats ¶ added in v1.63.0
func WithDBStats() Option
WithDBStats enables polling of DBStats metrics ref: https://pkg.go.dev/database/sql#DBStats These metrics are submitted to Datadog and are not billed as custom metrics
func WithDSN ¶ added in v1.16.0
WithDSN allows the data source name (DSN) to be provided when using OpenDB and a driver.Connector. The value is used to automatically set tags on spans.
func WithErrorCheck ¶ added in v1.42.0
WithErrorCheck specifies a function fn which determines whether the passed error should be marked as an error. The fn is called whenever a database/sql operation finishes with an error
func WithIgnoreQueryTypes ¶ added in v1.50.0
WithIgnoreQueryTypes specifies the query types for which spans should not be created.
func WithSQLCommentInjection
deprecated
added in
v1.39.0
func WithSQLCommentInjection(mode tracer.SQLCommentInjectionMode) Option
WithSQLCommentInjection enables injection of tags as sql comments on traced queries. This includes dynamic values like span id, trace id and sampling priority which can make queries unique for some cache implementations.
Deprecated: Use WithDBMPropagation instead.
func WithServiceName ¶
WithServiceName sets the given service name when registering a driver, or opening a database connection.
type RegisterOption ¶
type RegisterOption = Option
RegisterOption has been deprecated in favor of Option.
type TracedConn ¶ added in v1.49.0
type TracedConn struct {
v2.TracedConn
}
TracedConn holds a traced connection with tracing parameters.