package caddydogstatsd
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/datadog/datadog-go/statsd"
|
|
"github.com/caddyserver/caddy/caddyhttp/httpserver"
|
|
)
|
|
|
|
type dogstatsdHandler struct {
|
|
Client *statsd.Client
|
|
SampleRate float64
|
|
Next httpserver.Handler
|
|
}
|
|
|
|
func (h dogstatsdHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
|
|
// If we do not have a statsd.Client configured, then skip any processing
|
|
if h.Client == nil {
|
|
return h.Next.ServeHTTP(w, r)
|
|
}
|
|
|
|
// Grab the request start time
|
|
var start time.Time
|
|
start = time.Now()
|
|
|
|
// Handle the request
|
|
var code int
|
|
var err error
|
|
code, err = h.Next.ServeHTTP(w, r)
|
|
|
|
// Grab the request durection in Milliseconds
|
|
var elapsed time.Duration
|
|
var elapsedMS float64
|
|
elapsed = time.Since(start)
|
|
elapsedMS = float64(elapsed.Nanoseconds()) / float64(time.Millisecond)
|
|
|
|
// Report our request metrics to dogstatsd
|
|
var client statsd.Client
|
|
client = *h.Client
|
|
var extraTags = []string{
|
|
fmt.Sprintf("status_code:%d", code),
|
|
}
|
|
client.Count("caddy.response.count", 1, extraTags, h.SampleRate)
|
|
client.TimeInMilliseconds("caddy.response.time", elapsedMS, extraTags, h.SampleRate)
|
|
return code, err
|
|
}
|