@@ -71,9 +71,9 @@ type HandlerConfigParam func(*service.HandlerConfig)
71
71
type HandlerConfigFunc func (service.Handler , ... HandlerConfigParam ) * service.HandlerConfig
72
72
73
73
func (r * Router ) pprofLabel (config map [string ]* service.HandlerConfig , fn http.HandlerFunc ) http.HandlerFunc {
74
- return func (w http.ResponseWriter , r * http.Request ) {
74
+ return func (w http.ResponseWriter , req * http.Request ) {
75
75
var name = sdk .RandomString (12 )
76
- rc := config [r .Method ]
76
+ rc := config [req .Method ]
77
77
if rc != nil && rc .Handler != nil {
78
78
name = runtime .FuncForPC (reflect .ValueOf (rc .Handler ).Pointer ()).Name ()
79
79
name = strings .Replace (name , ".func1" , "" , 1 )
@@ -82,14 +82,14 @@ func (r *Router) pprofLabel(config map[string]*service.HandlerConfig, fn http.Ha
82
82
id := fmt .Sprintf ("%d" , sdk .GoroutineID ())
83
83
84
84
labels := pprof .Labels (
85
- "http-path" , r .URL .Path ,
85
+ "http-path" , req .URL .Path ,
86
86
"goroutine-id" , id ,
87
87
"goroutine-name" , name + "-" + id ,
88
88
)
89
- ctx := pprof .WithLabels (r .Context (), labels )
89
+ ctx := pprof .WithLabels (req .Context (), labels )
90
90
pprof .SetGoroutineLabels (ctx )
91
- r = r .WithContext (ctx )
92
- fn (w , r )
91
+ req = req .WithContext (ctx )
92
+ fn (w , req )
93
93
}
94
94
}
95
95
@@ -112,10 +112,10 @@ func (r *Router) recoverWrap(h http.HandlerFunc) http.HandlerFunc {
112
112
switch t := re .(type ) {
113
113
case string :
114
114
err = errors .New (t )
115
- case error :
116
- err = re .(error )
117
115
case sdk.Error :
118
116
err = re .(sdk.Error )
117
+ case error :
118
+ err = re .(error )
119
119
default :
120
120
err = sdk .ErrUnknownError
121
121
}
@@ -250,6 +250,18 @@ func (r *Router) computeScopeDetails() {
250
250
// Handle adds all handler for their specific verb in gorilla router for given uri
251
251
func (r * Router ) Handle (uri string , scope HandlerScope , handlers ... * service.HandlerConfig ) {
252
252
uri = r .Prefix + uri
253
+ config , f := r .handle (uri , scope , handlers ... )
254
+ r .Mux .Handle (uri , r .pprofLabel (config , r .compress (r .recoverWrap (f ))))
255
+ }
256
+
257
+ func (r * Router ) HandlePrefix (uri string , scope HandlerScope , handlers ... * service.HandlerConfig ) {
258
+ uri = r .Prefix + uri
259
+ config , f := r .handle (uri , scope , handlers ... )
260
+ r .Mux .PathPrefix (uri ).HandlerFunc (r .pprofLabel (config , r .compress (r .recoverWrap (f ))))
261
+ }
262
+
263
+ // Handle adds all handler for their specific verb in gorilla router for given uri
264
+ func (r * Router ) handle (uri string , scope HandlerScope , handlers ... * service.HandlerConfig ) (map [string ]* service.HandlerConfig , http.HandlerFunc ) {
253
265
cfg := & service.RouterConfig {
254
266
Config : map [string ]* service.HandlerConfig {},
255
267
}
@@ -385,7 +397,7 @@ func (r *Router) Handle(uri string, scope HandlerScope, handlers ...*service.Han
385
397
"route" : cleanURL ,
386
398
"request_uri" : req .RequestURI ,
387
399
"deprecated" : rc .IsDeprecated ,
388
- }, "[%d] | % s | END | %s [%s]" , responseWriter . statusCode , req .Method , req .URL , rc .Name )
400
+ }, "% s | END | %s [%s] | [%d] " , req .Method , req .URL , rc .Name , responseWriter . statusCode )
389
401
390
402
observability .RecordFloat64 (ctx , ServerLatency , float64 (latency )/ float64 (time .Millisecond ))
391
403
observability .Record (ctx , ServerRequestBytes , responseWriter .reqSize )
@@ -429,8 +441,7 @@ func (r *Router) Handle(uri string, scope HandlerScope, handlers ...*service.Han
429
441
deferFunc (ctx )
430
442
}
431
443
432
- // The chain is http -> mux -> f -> recover -> wrap -> pprof -> opencensus -> http
433
- r .Mux .Handle (uri , r .pprofLabel (cfg .Config , r .compress (r .recoverWrap (f ))))
444
+ return cfg .Config , f
434
445
}
435
446
436
447
type asynchronousRequest struct {
@@ -627,7 +638,7 @@ func EnableTracing() HandlerConfigParam {
627
638
628
639
// NotFoundHandler is called by default by Mux is any matching handler has been found
629
640
func NotFoundHandler (w http.ResponseWriter , req * http.Request ) {
630
- service .WriteError (context .Background (), w , req , sdk .WithStack (sdk .ErrNotFound ))
641
+ service .WriteError (context .Background (), w , req , sdk .NewError (sdk .ErrNotFound , fmt . Errorf ( "%s not found" , req . URL . Path ) ))
631
642
}
632
643
633
644
// StatusPanic returns router status. If nbPanic > 30 -> Alert, if nbPanic > 0 -> Warn
0 commit comments