GithubHelp home page GithubHelp logo

Comments (4)

willnewrelic avatar willnewrelic commented on July 19, 2024 1

Hi jasonab

You can give your handlers access to the transaction by adding it to the gin context. Add this line to nrgin.Middleware function right before c.Next():

c.Set("newrelic-txn", txn)

Then you can access it like so:

func handlerUsingTransaction(c *gin.Context) {
	t := c.Value("newrelic-txn")
	if txn, ok := t.(newrelic.Transaction); ok {
		defer newrelic.StartSegment(txn, "zap").End()
	}
	time.Sleep(500 * time.Millisecond)
}

We are hesitant to add this to the nrgin package because we plan on adding generic context support: this will be done using a typed key (as encouraged here), which Gin does not allow (only string keys), so we need to think about that.

from go-agent.

willnewrelic avatar willnewrelic commented on July 19, 2024

Hi @jasonab

You can instrument Redis activity with the current datastore segment functionality. In the beginning of the relevant function:

	defer newrelic.DatastoreSegment{
		StartTime:          newrelic.StartSegmentNow(txn),
		Product:             newrelic.DatastoreRedis,
		Operation:          "GET",
	}.End()

Glancing quickly at https://github.com/go-redis/redis I do not believe that it will be straightforward for us to add higher level support for this package: The interface is large and does not look like it has hooks for instrumentation. Nonetheless, we will investigate more closely!

from go-agent.

jasonab avatar jasonab commented on July 19, 2024

Appreciate the response. One challenge I have is I'm using this with the Gin middleware you developed. That works great, but I don't have access to the transaction from the middleware. Can I create a new object that will be merged into the middleware one, or do I somehow need to get access to the original?

from go-agent.

macnibblet avatar macnibblet commented on July 19, 2024

Actually go-redis does have support for instrumentation, you simply use the client.WrapProcess but i'm not 100% sure how you would store it in newrelic.

func NewrelicInstrumentation(client *redis.Client, nr newrelic.Application) {
	client.WrapProcess(func(oldProcess func(cmd redis.Cmder) error) func(cmd redis.Cmder) error {
		return func(cmd redis.Cmder) error {

			defer newrelic.DatastoreSegment{
				StartTime: newrelic.StartSegmentNow(nr.StartTransaction("redis", nil, nil)),
				Product:   newrelic.DatastoreRedis,
				Operation: cmd.String(),
			}.End()

			err := oldProcess(cmd)

			return err
		}
	})
}

from go-agent.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.