Merge pull request #2499 from calmh/metrics

Add metrics for HTTP calls
This commit is contained in:
Audrius Butkevicius 2015-11-21 13:08:26 +00:00
commit dcc5f333c1

View File

@ -25,6 +25,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/rcrowley/go-metrics"
"github.com/syncthing/syncthing/lib/auto" "github.com/syncthing/syncthing/lib/auto"
"github.com/syncthing/syncthing/lib/config" "github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/db" "github.com/syncthing/syncthing/lib/db"
@ -180,10 +181,11 @@ func (s *apiSvc) Serve() {
// Debug endpoints, not for general use // Debug endpoints, not for general use
getRestMux.HandleFunc("/rest/debug/peerCompletion", s.getPeerCompletion) getRestMux.HandleFunc("/rest/debug/peerCompletion", s.getPeerCompletion)
getRestMux.HandleFunc("/rest/debug/httpmetrics", s.getSystemHTTPMetrics)
// A handler that splits requests between the two above and disables // A handler that splits requests between the two above and disables
// caching // caching
restMux := noCacheMiddleware(getPostHandler(getRestMux, postRestMux)) restMux := noCacheMiddleware(metricsMiddleware(getPostHandler(getRestMux, postRestMux)))
// The main routing handler // The main routing handler
mux := http.NewServeMux() mux := http.NewServeMux()
@ -320,6 +322,15 @@ func debugMiddleware(h http.Handler) http.Handler {
}) })
} }
func metricsMiddleware(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
t := metrics.GetOrRegisterTimer(r.URL.Path, nil)
t0 := time.Now()
h.ServeHTTP(w, r)
t.UpdateSince(t0)
})
}
func redirectToHTTPSMiddleware(h http.Handler) http.Handler { func redirectToHTTPSMiddleware(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Add a generous access-control-allow-origin header since we may be // Add a generous access-control-allow-origin header since we may be
@ -743,6 +754,26 @@ func (s *apiSvc) getSystemLogTxt(w http.ResponseWriter, r *http.Request) {
} }
} }
func (s *apiSvc) getSystemHTTPMetrics(w http.ResponseWriter, r *http.Request) {
stats := make(map[string]interface{})
metrics.Each(func(name string, intf interface{}) {
if m, ok := intf.(*metrics.StandardTimer); ok {
pct := m.Percentiles([]float64{0.50, 0.95, 0.99})
for i := range pct {
pct[i] /= 1e6 // ns to ms
}
stats[name] = map[string]interface{}{
"count": m.Count(),
"sumMs": m.Sum() / 1e6, // ns to ms
"ratesPerS": []float64{m.Rate1(), m.Rate5(), m.Rate15()},
"percentilesMs": pct,
}
}
})
bs, _ := json.MarshalIndent(stats, "", " ")
w.Write(bs)
}
func (s *apiSvc) getSystemDiscovery(w http.ResponseWriter, r *http.Request) { func (s *apiSvc) getSystemDiscovery(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Content-Type", "application/json; charset=utf-8")
devices := make(map[string]discover.CacheEntry) devices := make(map[string]discover.CacheEntry)