| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- package newrelic
- import (
- "net/http"
- "net/url"
- )
- // Transaction represents a request or a background task.
- // Each Transaction should only be used in a single goroutine.
- type Transaction interface {
- // If StartTransaction is called with a non-nil http.ResponseWriter then
- // the Transaction may be used in its place. This allows
- // instrumentation of the response code and response headers.
- http.ResponseWriter
- // End finishes the current transaction, stopping all further
- // instrumentation. Subsequent calls to End will have no effect.
- End() error
- // Ignore ensures that this transaction's data will not be recorded.
- Ignore() error
- // SetName names the transaction. Transactions will not be grouped
- // usefully if too many unique names are used.
- SetName(name string) error
- // NoticeError records an error. The first five errors per transaction
- // are recorded (this behavior is subject to potential change in the
- // future).
- NoticeError(err error) error
- // AddAttribute adds a key value pair to the current transaction. This
- // information is attached to errors, transaction events, and error
- // events. The key must contain fewer than than 255 bytes. The value
- // must be a number, string, or boolean. Attribute configuration is
- // applied (see config.go).
- //
- // For more information, see:
- // https://docs.newrelic.com/docs/agents/manage-apm-agents/agent-metrics/collect-custom-attributes
- AddAttribute(key string, value interface{}) error
- // SetWebRequest marks the transaction as a web transaction. If
- // WebRequest is non-nil, SetWebRequest will additionally collect
- // details on request attributes, url, and method. If headers are
- // present, the agent will look for a distributed tracing header. Use
- // NewWebRequest to transform a *http.Request into a WebRequest.
- SetWebRequest(WebRequest) error
- // StartSegmentNow allows the timing of functions, external calls, and
- // datastore calls. The segments of each transaction MUST be used in a
- // single goroutine. Consumers are encouraged to use the
- // `StartSegmentNow` functions which checks if the Transaction is nil.
- // See segments.go
- StartSegmentNow() SegmentStartTime
- // CreateDistributedTracePayload creates a payload to link the calls
- // between transactions. This method never returns nil. Instead, it may
- // return a shim implementation whose methods return empty strings.
- // CreateDistributedTracePayload should be called every time an outbound
- // call is made since the payload contains a timestamp.
- //
- // StartExternalSegment calls CreateDistributedTracePayload, so you
- // should not need to use this method for typical outbound HTTP calls.
- // Just use StartExternalSegment!
- CreateDistributedTracePayload() DistributedTracePayload
- // AcceptDistributedTracePayload is used at the beginning of a
- // transaction to identify the caller.
- //
- // Application.StartTransaction calls this method automatically if a
- // payload is present in the request headers (under the key
- // DistributedTracePayloadHeader). Therefore, this method does not need
- // to be used for typical HTTP transactions.
- //
- // AcceptDistributedTracePayload should be used as early in the
- // transaction as possible. It may not be called after a call to
- // CreateDistributedTracePayload.
- //
- // The payload parameter may be a DistributedTracePayload or a string.
- AcceptDistributedTracePayload(t TransportType, payload interface{}) error
- }
- // DistributedTracePayload is used to instrument connections between
- // transactions and applications.
- type DistributedTracePayload interface {
- // HTTPSafe serializes the payload into a string containing http safe
- // characters.
- HTTPSafe() string
- // Text serializes the payload into a string. The format is slightly
- // more compact than HTTPSafe.
- Text() string
- }
- const (
- // DistributedTracePayloadHeader is the header used by New Relic agents
- // for automatic trace payload instrumentation.
- DistributedTracePayloadHeader = "Newrelic"
- )
- // TransportType represents the type of connection that the trace payload was
- // transported over.
- type TransportType struct{ name string }
- // TransportType names used across New Relic agents:
- var (
- TransportUnknown = TransportType{name: "Unknown"}
- TransportHTTP = TransportType{name: "HTTP"}
- TransportHTTPS = TransportType{name: "HTTPS"}
- TransportKafka = TransportType{name: "Kafka"}
- TransportJMS = TransportType{name: "JMS"}
- TransportIronMQ = TransportType{name: "IronMQ"}
- TransportAMQP = TransportType{name: "AMQP"}
- TransportQueue = TransportType{name: "Queue"}
- TransportOther = TransportType{name: "Other"}
- )
- // WebRequest may be implemented to provide request information to
- // Transaction.SetWebRequest.
- type WebRequest interface {
- // Header may return nil if you don't have any headers or don't want to
- // transform them to http.Header format.
- Header() http.Header
- // URL may return nil if you don't have a URL or don't want to transform
- // it to *url.URL.
- URL() *url.URL
- Method() string
- // If a distributed tracing header is found in the headers returned by
- // Header(), this TransportType will be used in the distributed tracing
- // metrics.
- Transport() TransportType
- }
- // NewWebRequest turns a *http.Request into a WebRequest for input into
- // Transaction.SetWebRequest.
- func NewWebRequest(request *http.Request) WebRequest {
- if nil == request {
- return nil
- }
- return requestWrap{request: request}
- }
|