1
1
package api
2
2
3
3
import (
4
+ "fmt"
4
5
"github.com/formancehq/go-libs/v2/api"
5
6
"github.com/formancehq/go-libs/v2/bun/bunpaginate"
7
+ "github.com/formancehq/go-libs/v2/service"
6
8
"github.com/formancehq/ledger/internal/api/bulking"
7
9
"github.com/formancehq/ledger/internal/controller/system"
8
- "go.opentelemetry.io/otel/attribute"
9
10
"go.opentelemetry.io/otel/trace"
10
11
nooptracer "go.opentelemetry.io/otel/trace/noop"
11
12
"net/http"
@@ -36,37 +37,47 @@ func NewRouter(
36
37
37
38
mux := chi .NewRouter ()
38
39
mux .Use (
39
- middleware .Recoverer ,
40
40
cors .New (cors.Options {
41
41
AllowOriginFunc : func (r * http.Request , origin string ) bool {
42
42
return true
43
43
},
44
44
AllowCredentials : true ,
45
45
}).Handler ,
46
46
common .LogID (),
47
- )
48
-
49
- commonMiddlewares := []func (http.Handler ) http.Handler {
50
47
middleware .RequestLogger (api .NewLogFormatter ()),
51
- }
52
-
53
- if debug {
54
- commonMiddlewares = append (commonMiddlewares , func (handler http.Handler ) http.Handler {
55
- return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
56
- trace .SpanFromContext (r .Context ()).
57
- SetAttributes (attribute .String ("raw-query" , r .URL .RawQuery ))
58
-
59
- handler .ServeHTTP (w , r )
60
- })
61
- })
62
- }
48
+ service .OTLPMiddleware ("ledger" , debug ),
49
+ func (next http.Handler ) http.Handler {
50
+ fn := func (w http.ResponseWriter , r * http.Request ) {
51
+ defer func () {
52
+ if rvr := recover (); rvr != nil {
53
+ if rvr == http .ErrAbortHandler {
54
+ // we don't recover http.ErrAbortHandler so the response
55
+ // to the client is aborted, this should not be logged
56
+ panic (rvr )
57
+ }
58
+
59
+ if debug {
60
+ middleware .PrintPrettyStack (rvr )
61
+ }
62
+
63
+ trace .SpanFromContext (r .Context ()).RecordError (fmt .Errorf ("%s" , rvr ))
64
+
65
+ w .WriteHeader (http .StatusInternalServerError )
66
+ }
67
+ }()
68
+
69
+ next .ServeHTTP (w , r )
70
+ }
71
+
72
+ return http .HandlerFunc (fn )
73
+ },
74
+ )
63
75
64
76
v2Router := v2 .NewRouter (
65
77
systemController ,
66
78
authenticator ,
67
79
debug ,
68
80
v2 .WithTracer (routerOptions .tracer ),
69
- v2 .WithMiddlewares (commonMiddlewares ... ),
70
81
v2 .WithBulkerFactory (routerOptions .bulkerFactory ),
71
82
v2 .WithBulkHandlerFactories (map [string ]bulking.HandlerFactory {
72
83
"application/json" : bulking .NewJSONBulkHandlerFactory (routerOptions .bulkMaxSize ),
@@ -84,15 +95,14 @@ func NewRouter(
84
95
version ,
85
96
debug ,
86
97
v1 .WithTracer (routerOptions .tracer ),
87
- v1 .WithMiddlewares (commonMiddlewares ... ),
88
98
))
89
99
90
100
return mux
91
101
}
92
102
93
103
type routerOptions struct {
94
- tracer trace.Tracer
95
- bulkMaxSize int
104
+ tracer trace.Tracer
105
+ bulkMaxSize int
96
106
bulkerFactory bulking.BulkerFactory
97
107
paginationConfig common.PaginationConfig
98
108
}
0 commit comments