This is an automated email from the ASF dual-hosted git repository.

rob pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 8f303e1  add pprof debugging served on localhost:6060 and move 
db-stats and memory-stats endpoints there as well
8f303e1 is described below

commit 8f303e18106ec51b1431284ef89be9537ebf6385
Author: Dylan Volz <dylan_v...@comcast.com>
AuthorDate: Wed Aug 8 14:02:11 2018 -0600

    add pprof debugging served on localhost:6060 and move db-stats and 
memory-stats endpoints there as well
---
 traffic_ops/traffic_ops_golang/routes.go           | 51 ++++++++--------------
 .../traffic_ops_golang/traffic_ops_golang.go       | 15 +++++++
 2 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/traffic_ops/traffic_ops_golang/routes.go 
b/traffic_ops/traffic_ops_golang/routes.go
index 13e0470..2f12491 100644
--- a/traffic_ops/traffic_ops_golang/routes.go
+++ b/traffic_ops/traffic_ops_golang/routes.go
@@ -386,54 +386,41 @@ func Routes(d ServerData) ([]Route, []RawRoute, 
http.Handler, error) {
                {http.MethodGet, `tools/write_crconfig/{cdn}/?$`, 
crconfig.SnapshotOldGUIHandler(d.DB, d.Config), auth.PrivLevelOperations, 
Authenticated, nil},
                // DEPRECATED - use GET /api/1.2/cdns/{cdn}/snapshot
                {http.MethodGet, `CRConfig-Snapshots/{cdn}/CRConfig.json?$`, 
crconfig.SnapshotOldGetHandler(d.DB, d.Config), auth.PrivLevelReadOnly, 
Authenticated, nil},
-               // USED FOR Debugging
-               {http.MethodGet, `admin/memory-stats`, 
memoryStatsHandler(d.Profiling), auth.PrivLevelOperations, Authenticated, nil},
-               {http.MethodGet, `admin/db-stats`, dbStatsHandler(d.Profiling, 
d.DB), auth.PrivLevelOperations, Authenticated, nil},
        }
 
        return routes, rawRoutes, proxyHandler, nil
 }
 
-func memoryStatsHandler(profiling *bool) http.HandlerFunc {
+func memoryStatsHandler() http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
                handleErrs := tc.GetHandleErrorsFunc(w, r)
-               if *profiling {
-                       stats := runtime.MemStats{}
-                       runtime.ReadMemStats(&stats)
-
-                       bytes, err := json.Marshal(stats)
-                       if err != nil {
-                               tclog.Errorln("unable to marshal stats: " + 
err.Error())
-                               handleErrs(http.StatusInternalServerError, 
errors.New("marshalling error"))
-                               return
-                       }
-                       w.Header().Set("Content-Type", "application/json")
-                       w.Write(bytes)
-               } else {
-                       handleErrs(http.StatusPreconditionFailed, 
errors.New("profiling is not enabled"))
+               stats := runtime.MemStats{}
+               runtime.ReadMemStats(&stats)
+
+               bytes, err := json.Marshal(stats)
+               if err != nil {
+                       tclog.Errorln("unable to marshal stats: " + err.Error())
+                       handleErrs(http.StatusInternalServerError, 
errors.New("marshalling error"))
                        return
                }
+               w.Header().Set("Content-Type", "application/json")
+               w.Write(bytes)
        }
 }
 
-func dbStatsHandler(profiling *bool, db *sqlx.DB) http.HandlerFunc {
+func dbStatsHandler(db *sqlx.DB) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
                handleErrs := tc.GetHandleErrorsFunc(w, r)
-               if *profiling {
-                       stats := db.DB.Stats()
-
-                       bytes, err := json.Marshal(stats)
-                       if err != nil {
-                               tclog.Errorln("unable to marshal stats: " + 
err.Error())
-                               handleErrs(http.StatusInternalServerError, 
errors.New("marshalling error"))
-                               return
-                       }
-                       w.Header().Set("Content-Type", "application/json")
-                       w.Write(bytes)
-               } else {
-                       handleErrs(http.StatusPreconditionFailed, 
errors.New("profiling is not enabled"))
+               stats := db.DB.Stats()
+
+               bytes, err := json.Marshal(stats)
+               if err != nil {
+                       tclog.Errorln("unable to marshal stats: " + err.Error())
+                       handleErrs(http.StatusInternalServerError, 
errors.New("marshalling error"))
                        return
                }
+               w.Header().Set("Content-Type", "application/json")
+               w.Write(bytes)
        }
 }
 
diff --git a/traffic_ops/traffic_ops_golang/traffic_ops_golang.go 
b/traffic_ops/traffic_ops_golang/traffic_ops_golang.go
index 0de7644..c8348fb 100644
--- a/traffic_ops/traffic_ops_golang/traffic_ops_golang.go
+++ b/traffic_ops/traffic_ops_golang/traffic_ops_golang.go
@@ -24,6 +24,7 @@ import (
        "flag"
        "fmt"
        "net/http"
+       _ "net/http/pprof"
        "os"
        "os/signal"
        "path/filepath"
@@ -125,6 +126,19 @@ func main() {
 
        profiling := cfg.ProfilingEnabled
 
+       pprofMux := http.DefaultServeMux
+       http.DefaultServeMux = http.NewServeMux() // this is so we don't serve 
pprof over 443.
+
+       pprofMux.Handle("/db-stats", dbStatsHandler(db))
+       pprofMux.Handle("/memory-stats", memoryStatsHandler())
+       go func() {
+               debugServer := http.Server{
+                       Addr:    "localhost:6060",
+                       Handler: pprofMux,
+               }
+               log.Errorln(debugServer.ListenAndServe())
+       }()
+
        if err := RegisterRoutes(ServerData{DB: db, Config: cfg, Profiling: 
&profiling}); err != nil {
                log.Errorf("registering routes: %v\n", err)
                return
@@ -179,6 +193,7 @@ func SetNewProfilingInfo(configFileName string, 
currentProfilingEnabled *bool, c
        }
        if *currentProfilingEnabled != newProfilingEnabled {
                log.Infof("profiling enabled set to %t\n", newProfilingEnabled)
+               log.Infof("profiling location set to: %s\n", 
*currentProfilingLocation)
                *currentProfilingEnabled = newProfilingEnabled
                if *currentProfilingEnabled {
                        continuousProfile(currentProfilingEnabled, 
currentProfilingLocation, version)

Reply via email to