terraform/vendor/github.com/newrelic/go-agent/segments.go

114 lines
3.4 KiB
Go

package newrelic
import "net/http"
// SegmentStartTime is created by Transaction.StartSegmentNow and marks the
// beginning of a segment. A segment with a zero-valued SegmentStartTime may
// safely be ended.
type SegmentStartTime struct{ segment }
// Segment is used to instrument functions, methods, and blocks of code. The
// easiest way use Segment is the StartSegment function.
type Segment struct {
StartTime SegmentStartTime
Name string
}
// DatastoreSegment is used to instrument calls to databases and object stores.
// Here is an example:
//
// defer newrelic.DatastoreSegment{
// StartTime: newrelic.StartSegmentNow(txn),
// Product: newrelic.DatastoreMySQL,
// Collection: "my_table",
// Operation: "SELECT",
// }.End()
//
type DatastoreSegment struct {
StartTime SegmentStartTime
// Product is the datastore type. See the constants in datastore.go.
Product DatastoreProduct
// Collection is the table or group.
Collection string
// Operation is the relevant action, e.g. "SELECT" or "GET".
Operation string
// ParameterizedQuery may be set to the query being performed. It must
// not contain any raw parameters, only placeholders.
ParameterizedQuery string
// QueryParameters may be used to provide query parameters. Care should
// be taken to only provide parameters which are not sensitive.
// QueryParameters are ignored in high security mode.
QueryParameters map[string]interface{}
// Host is the name of the server hosting the datastore.
Host string
// PortPathOrID can represent either the port, path, or id of the
// datastore being connected to.
PortPathOrID string
// DatabaseName is name of database where the current query is being
// executed.
DatabaseName string
}
// ExternalSegment is used to instrument external calls. StartExternalSegment
// is recommended when you have access to an http.Request.
type ExternalSegment struct {
StartTime SegmentStartTime
Request *http.Request
Response *http.Response
// If you do not have access to the request, this URL field should be
// used to indicate the endpoint.
URL string
}
// End finishes the segment.
func (s Segment) End() { endSegment(s) }
// End finishes the datastore segment.
func (s DatastoreSegment) End() { endDatastore(s) }
// End finishes the external segment.
func (s ExternalSegment) End() { endExternal(s) }
// StartSegmentNow helps avoid Transaction nil checks.
func StartSegmentNow(txn Transaction) SegmentStartTime {
if nil != txn {
return txn.StartSegmentNow()
}
return SegmentStartTime{}
}
// StartSegment makes it easy to instrument segments. To time a function, do
// the following:
//
// func timeMe(txn newrelic.Transaction) {
// defer newrelic.StartSegment(txn, "timeMe").End()
// // ... function code here ...
// }
//
// To time a block of code, do the following:
//
// segment := StartSegment(txn, "myBlock")
// // ... code you want to time here ...
// segment.End()
//
func StartSegment(txn Transaction, name string) Segment {
return Segment{
StartTime: StartSegmentNow(txn),
Name: name,
}
}
// StartExternalSegment makes it easier to instrument external calls.
//
// segment := newrelic.StartExternalSegment(txn, request)
// resp, err := client.Do(request)
// segment.Response = resp
// segment.End()
//
func StartExternalSegment(txn Transaction, request *http.Request) ExternalSegment {
return ExternalSegment{
StartTime: StartSegmentNow(txn),
Request: request,
}
}