195 lines
4.5 KiB
Go
195 lines
4.5 KiB
Go
|
package gorelic
|
||
|
|
||
|
import (
|
||
|
metrics "github.com/yvasiyarov/go-metrics"
|
||
|
"github.com/yvasiyarov/newrelic_platform_go"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type tHTTPHandlerFunc func(http.ResponseWriter, *http.Request)
|
||
|
type tHTTPHandler struct {
|
||
|
originalHandler http.Handler
|
||
|
originalHandlerFunc tHTTPHandlerFunc
|
||
|
isFunc bool
|
||
|
timer metrics.Timer
|
||
|
}
|
||
|
|
||
|
var httpTimer metrics.Timer
|
||
|
|
||
|
func newHTTPHandlerFunc(h tHTTPHandlerFunc) *tHTTPHandler {
|
||
|
return &tHTTPHandler{
|
||
|
isFunc: true,
|
||
|
originalHandlerFunc: h,
|
||
|
}
|
||
|
}
|
||
|
func newHTTPHandler(h http.Handler) *tHTTPHandler {
|
||
|
return &tHTTPHandler{
|
||
|
isFunc: false,
|
||
|
originalHandler: h,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (handler *tHTTPHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||
|
startTime := time.Now()
|
||
|
defer handler.timer.UpdateSince(startTime)
|
||
|
|
||
|
if handler.isFunc {
|
||
|
handler.originalHandlerFunc(w, req)
|
||
|
} else {
|
||
|
handler.originalHandler.ServeHTTP(w, req)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type baseTimerMetrica struct {
|
||
|
dataSource metrics.Timer
|
||
|
name string
|
||
|
units string
|
||
|
}
|
||
|
|
||
|
func (metrica *baseTimerMetrica) GetName() string {
|
||
|
return metrica.name
|
||
|
}
|
||
|
|
||
|
func (metrica *baseTimerMetrica) GetUnits() string {
|
||
|
return metrica.units
|
||
|
}
|
||
|
|
||
|
type timerRate1Metrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerRate1Metrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.Rate1(), nil
|
||
|
}
|
||
|
|
||
|
type timerRateMeanMetrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerRateMeanMetrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.RateMean(), nil
|
||
|
}
|
||
|
|
||
|
type timerMeanMetrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerMeanMetrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.Mean() / float64(time.Millisecond), nil
|
||
|
}
|
||
|
|
||
|
type timerMinMetrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerMinMetrica) GetValue() (float64, error) {
|
||
|
return float64(metrica.dataSource.Min()) / float64(time.Millisecond), nil
|
||
|
}
|
||
|
|
||
|
type timerMaxMetrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerMaxMetrica) GetValue() (float64, error) {
|
||
|
return float64(metrica.dataSource.Max()) / float64(time.Millisecond), nil
|
||
|
}
|
||
|
|
||
|
type timerPercentile75Metrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerPercentile75Metrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.Percentile(0.75) / float64(time.Millisecond), nil
|
||
|
}
|
||
|
|
||
|
type timerPercentile90Metrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerPercentile90Metrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.Percentile(0.90) / float64(time.Millisecond), nil
|
||
|
}
|
||
|
|
||
|
type timerPercentile95Metrica struct {
|
||
|
*baseTimerMetrica
|
||
|
}
|
||
|
|
||
|
func (metrica *timerPercentile95Metrica) GetValue() (float64, error) {
|
||
|
return metrica.dataSource.Percentile(0.95) / float64(time.Millisecond), nil
|
||
|
}
|
||
|
|
||
|
func addHTTPMericsToComponent(component newrelic_platform_go.IComponent, timer metrics.Timer) {
|
||
|
rate1 := &timerRate1Metrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/throughput/1minute",
|
||
|
units: "rps",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(rate1)
|
||
|
|
||
|
rateMean := &timerRateMeanMetrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/throughput/rateMean",
|
||
|
units: "rps",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(rateMean)
|
||
|
|
||
|
responseTimeMean := &timerMeanMetrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/responseTime/mean",
|
||
|
units: "ms",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(responseTimeMean)
|
||
|
|
||
|
responseTimeMax := &timerMaxMetrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/responseTime/max",
|
||
|
units: "ms",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(responseTimeMax)
|
||
|
|
||
|
responseTimeMin := &timerMinMetrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/responseTime/min",
|
||
|
units: "ms",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(responseTimeMin)
|
||
|
|
||
|
responseTimePercentile75 := &timerPercentile75Metrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/responseTime/percentile75",
|
||
|
units: "ms",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(responseTimePercentile75)
|
||
|
|
||
|
responseTimePercentile90 := &timerPercentile90Metrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/responseTime/percentile90",
|
||
|
units: "ms",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(responseTimePercentile90)
|
||
|
|
||
|
responseTimePercentile95 := &timerPercentile95Metrica{
|
||
|
baseTimerMetrica: &baseTimerMetrica{
|
||
|
name: "http/responseTime/percentile95",
|
||
|
units: "ms",
|
||
|
dataSource: timer,
|
||
|
},
|
||
|
}
|
||
|
component.AddMetrica(responseTimePercentile95)
|
||
|
}
|