sqlx

command module
v0.0.0-...-0a94385 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 7, 2021 License: Apache-2.0 Imports: 7 Imported by: 0

Documentation

Overview

An application that illustrates how to instrument jmoiron/sqlx with DatastoreSegments

To run this example, be sure the environment varible NEW_RELIC_LICENSE_KEY is set to your license key. Postgres must be running on the default port 5432 and have a user "foo" and a database "bar". One quick (albeit insecure) way of doing this is to run a small local Postgres instance in Docker:

docker run --rm -e POSTGRES_USER=foo -e POSTGRES_DB=bar \
  -e POSTGRES_PASSWORD=password -e POSTGRES_HOST_AUTH_METHOD=trust \
  -p 5432:5432 postgres &

Adding instrumentation for the SQLx package is easy. It means you can make database calls without having to manually create DatastoreSegments. Setup can be done in two steps:

Set up your driver

If you are using one of our currently supported database drivers (see https://docs.oldfritter.com/docs/agents/go-agent/get-started/go-agent-compatibility-requirements#frameworks), follow the instructions on installing the driver.

As an example, for the `lib/pq` driver, you will use the oldfritter integration's driver in place of the postgres driver. If your code is using sqlx.Open with `lib/pq` like this:

import (
	"github.com/jmoiron/sqlx"
	_ "github.com/lib/pq"
)

func main() {
	db, err := sqlx.Open("postgres", "user=pqgotest dbname=pqgotest sslmode=verify-full")
}

Then change the side-effect import to the integration package, and open "nrpostgres" instead:

import (
	"github.com/jmoiron/sqlx"
	_ "github.com/oldfritter/go-agent/v3/integrations/nrpq"
)

func main() {
	db, err := sqlx.Open("nrpostgres", "user=pqgotest dbname=pqgotest sslmode=verify-full")
}

If you are not using one of the supported database drivers, use the `InstrumentSQLDriver` (https://godoc.org/github.com/oldfritter/go-agent#InstrumentSQLDriver) API. See https://github.com/oldfritter/go-agent/blob/master/v3/integrations/nrmysql/nrmysql.go for a full example.

Add context to your database calls

Next, you must provide a context containing a oldfritter.Transaction to all methods on sqlx.DB, sqlx.NamedStmt, sqlx.Stmt, and sqlx.Tx that make a database call. For example, instead of the following:

err := db.Get(&jason, "SELECT * FROM person WHERE first_name=$1", "Jason")

Do this:

ctx := oldfritter.NewContext(context.Background(), txn)
err := db.GetContext(ctx, &jason, "SELECT * FROM person WHERE first_name=$1", "Jason")

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL