mirror of
https://github.com/octoleo/syncthing.git
synced 2024-12-23 03:18:59 +00:00
commit
dcc5f333c1
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user