Comments (6)
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.
Hello, how's the progress of this issue?
from go-agent.
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.
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 tohttp://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.
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.
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)
- nrzap log in context ignores additional fields HOT 9
- Blocking send in `Consume()` causes a lot of goroutines to pile up
- golang protobuff is deprecated
- github.com/golang/protobuf is deprecated HOT 1
- Add slog integration HOT 8
- Missing release notes for v3.25.1 HOT 3
- Consumes a lot of memory during large body size requests HOT 2
- External Services(AWS sdk go v2 ) api calls are not logged / visible when using github.com/newrelic/go-agent/v3/integrations/nrawssdk-v HOT 3
- Remove fasthttp dependency from main module HOT 2
- Update google.golang.org/grpc from 1.54.0 to 1.56.3 HOT 2
- transaction.go reqBody(req *http.Request) turn nil body into non Nil body for request.Body == http.NoBody HOT 1
- Add support to CopyFrom method in pgx integration HOT 1
- fmt.Stringer support for user attributes (especially for SQL query parameters)
- UNKNOWN log levels when using the native log package HOT 2
- `.Ignore()` not ignoring transaction (go-agent + nrgin) HOT 6
- Integration for gqlgen HOT 2
- nrpgx5 data-race HOT 5
- Changelog Go agent EOL Policy link is broken HOT 1
- agent with nrzap is not forwarding logs to newrelic HOT 3
- WrapBackgroundCore background logger is not sending logs to new relic but transaction logger is HOT 12
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from go-agent.