GithubHelp home page GithubHelp logo

Comments (6)

willnewrelic avatar willnewrelic commented on July 19, 2024 5

Hi @justiandre

Thanks for writing in! Host level external metrics do not have the specificity you need: You want to be able to add the first segment of the path to the metric, or control the name of the metric directly. I see how that would be useful!

I have brought this idea to the attention of our product management.

For the time being, I recommend using the URL field of the ExternalSegment: You can create a fictitious url with the first path segment in the hostname. Example:

	s := newrelic.ExternalSegment{
		StartTime: newrelic.StartSegmentNow(txn),
		URL:       "http://api_gateway_service_02",
	}
	// external call here
	s.End()

Just be careful to ensure that URL contains a scheme: It will be parsed by the standard library's url.Parse.

from go-agent.

justiandre avatar justiandre commented on July 19, 2024 2

Hello, how's the progress of this issue?

from go-agent.

willnewrelic avatar willnewrelic commented on July 19, 2024

Hey @justiandre

Here is some code that demonstrates the interim solution described above: This code creates external metrics External/example.com_zip/all from requests to http://example.com/zip/zap.

func startExternal(txn newrelic.Transaction, req *http.Request) *newrelic.ExternalSegment {
	segment := newrelic.StartExternalSegment(txn, req)
	if u := req.URL; nil != u {
		var firstSegment string
		if s := strings.Split(strings.TrimPrefix(u.Path, "/"), "/"); len(s) > 0 {
			firstSegment = s[0]
		}
		nu := url.URL{
			Scheme: u.Scheme,
			Host:   u.Host + "_" + firstSegment,
		}
		segment.URL = nu.String()
	}
	return segment
}

func doRequest(txn newrelic.Transaction) {
	client := &http.Client{}
	request, _ := http.NewRequest("GET", "http://example.com/zip/zap", nil)
	segment := startExternal(txn, request)
	defer segment.End()
	resp, err := client.Do(request)
	if nil != err {
		return
	}
	defer resp.Body.Close()
	fmt.Println(resp.StatusCode)
}

We acknowledge that this is bothersome, and we are discussing improvements and additional ExternalSegment fields!

from go-agent.

justiandre avatar justiandre commented on July 19, 2024

Hey @justiandre

Here is some code that demonstrates the interim solution described above: This code creates external metrics External/example.com_zip/all from requests to http://example.com/zip/zap.

func startExternal(txn newrelic.Transaction, req *http.Request) *newrelic.ExternalSegment {
	segment := newrelic.StartExternalSegment(txn, req)
	if u := req.URL; nil != u {
		var firstSegment string
		if s := strings.Split(strings.TrimPrefix(u.Path, "/"), "/"); len(s) > 0 {
			firstSegment = s[0]
		}
		nu := url.URL{
			Scheme: u.Scheme,
			Host:   u.Host + "_" + firstSegment,
		}
		segment.URL = nu.String()
	}
	return segment
}

func doRequest(txn newrelic.Transaction) {
	client := &http.Client{}
	request, _ := http.NewRequest("GET", "http://example.com/zip/zap", nil)
	segment := startExternal(txn, request)
	defer segment.End()
	resp, err := client.Do(request)
	if nil != err {
		return
	}
	defer resp.Body.Close()
	fmt.Println(resp.StatusCode)
}

We acknowledge that this is bothersome, and we are discussing improvements and additional ExternalSegment fields!

Today we are doing so, but it is a very very inelegant solution and that does not make sense !! It is difficult to generalize it into other components.

from go-agent.

willnewrelic avatar willnewrelic commented on July 19, 2024

Hi @justiandre

We just released version 2.9.0 which includes changes you might find useful!

ExternalSegment now has three new optional fields: Host, Procedure, and Library.

  • Host is used for external metrics, transaction trace segment names, and span event names.
  • Procedure is used for transaction breakdown metrics.
  • Library is used for external metrics and the "component" span attribute. "http" is the default.

The easier thing to do is just populate Host field with the name you would like to see:

    segment := newrelic.ExternalSegment{
        StartTime: txn.StartSegmentNow(),
        Host:      "api_gateway_service_01",  // slashes are not allowed, so use underscores
    }

Alternatively, you can populate both Host and Procedure. Unfortunately, the External tab metrics do not include Procedure: It will only appear in the metrics in each transaction breakdown.

    segment := newrelic.ExternalSegment{
        StartTime: txn.StartSegmentNow(),
        Host:      "api_gateway",
        Procedure: "service_01",
    }

We hope these new fields make things better for you!

from go-agent.

willnewrelic avatar willnewrelic commented on July 19, 2024

Hi @justiandre !

I hope the new ExternalSegment fields are working for you! I'm going to close this: Don't hesitate to re-open this or reach out if you would like to discuss further!

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.