Skip to content

Commit bf06acf

Browse files
authored
Move all query service HTTP handlers into one function (jaegertracing#6128)
## Which problem is this PR solving? - Prequel for jaegertracing#6121 ## Description of the changes - Consolidate business logic handlers into a single function `initRouter` - Move tenancy handling to the same function, remove it from API and APIv3 handlers ## How was this change tested? - `go test ./cmd/query/app/...` --------- Signed-off-by: Yuri Shkuro <[email protected]>
1 parent a4efe57 commit bf06acf

File tree

6 files changed

+36
-94
lines changed

6 files changed

+36
-94
lines changed

cmd/query/app/apiv3/gateway_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"github.com/jaegertracing/jaeger/cmd/query/app/internal/api_v3"
2323
"github.com/jaegertracing/jaeger/model"
2424
_ "github.com/jaegertracing/jaeger/pkg/gogocodec" // force gogo codec registration
25-
"github.com/jaegertracing/jaeger/pkg/tenancy"
2625
"github.com/jaegertracing/jaeger/storage/spanstore"
2726
spanstoremocks "github.com/jaegertracing/jaeger/storage/spanstore/mocks"
2827
)
@@ -101,10 +100,9 @@ func makeTestTrace() (*model.Trace, model.TraceID) {
101100
func runGatewayTests(
102101
t *testing.T,
103102
basePath string,
104-
tenancyOptions tenancy.Options,
105103
setupRequest func(*http.Request),
106104
) {
107-
gw := setupHTTPGateway(t, basePath, tenancyOptions)
105+
gw := setupHTTPGateway(t, basePath)
108106
gw.setupRequest = setupRequest
109107
t.Run("GetServices", gw.runGatewayGetServices)
110108
t.Run("GetOperations", gw.runGatewayGetOperations)

cmd/query/app/apiv3/http_gateway.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"github.com/jaegertracing/jaeger/cmd/query/app/internal/api_v3"
2424
"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
2525
"github.com/jaegertracing/jaeger/model"
26-
"github.com/jaegertracing/jaeger/pkg/tenancy"
2726
"github.com/jaegertracing/jaeger/storage/spanstore"
2827
)
2928

@@ -46,7 +45,6 @@ const (
4645
// HTTPGateway exposes APIv3 HTTP endpoints.
4746
type HTTPGateway struct {
4847
QueryService *querysvc.QueryService
49-
TenancyMgr *tenancy.Manager
5048
Logger *zap.Logger
5149
Tracer trace.TracerProvider
5250
}
@@ -69,9 +67,6 @@ func (h *HTTPGateway) addRoute(
6967
_ ...any, /* args */
7068
) *mux.Route {
7169
var handler http.Handler = http.HandlerFunc(f)
72-
if h.TenancyMgr.Enabled {
73-
handler = tenancy.ExtractTenantHTTPHandler(h.TenancyMgr, handler)
74-
}
7570
traceMiddleware := otelhttp.NewHandler(
7671
otelhttp.WithRouteTag(route, handler),
7772
route,

cmd/query/app/apiv3/http_gateway_test.go

Lines changed: 7 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package apiv3
66
import (
77
"errors"
88
"fmt"
9-
"io"
109
"net/http"
1110
"net/http/httptest"
1211
"net/url"
@@ -22,7 +21,6 @@ import (
2221
"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
2322
"github.com/jaegertracing/jaeger/model"
2423
"github.com/jaegertracing/jaeger/pkg/jtracer"
25-
"github.com/jaegertracing/jaeger/pkg/tenancy"
2624
"github.com/jaegertracing/jaeger/pkg/testutils"
2725
dependencyStoreMocks "github.com/jaegertracing/jaeger/storage/dependencystore/mocks"
2826
"github.com/jaegertracing/jaeger/storage/spanstore"
@@ -32,7 +30,6 @@ import (
3230
func setupHTTPGatewayNoServer(
3331
_ *testing.T,
3432
basePath string,
35-
tenancyOptions tenancy.Options,
3633
) *testGateway {
3734
gw := &testGateway{
3835
reader: &spanstoremocks.Reader{},
@@ -45,7 +42,6 @@ func setupHTTPGatewayNoServer(
4542

4643
hgw := &HTTPGateway{
4744
QueryService: q,
48-
TenancyMgr: tenancy.NewManager(&tenancyOptions),
4945
Logger: zap.NewNop(),
5046
Tracer: jtracer.NoOp().OTEL,
5147
}
@@ -61,9 +57,8 @@ func setupHTTPGatewayNoServer(
6157
func setupHTTPGateway(
6258
t *testing.T,
6359
basePath string,
64-
tenancyOptions tenancy.Options,
6560
) *testGateway {
66-
gw := setupHTTPGatewayNoServer(t, basePath, tenancyOptions)
61+
gw := setupHTTPGatewayNoServer(t, basePath)
6762

6863
httpServer := httptest.NewServer(gw.router)
6964
t.Cleanup(func() { httpServer.Close() })
@@ -76,22 +71,7 @@ func setupHTTPGateway(
7671
}
7772

7873
func TestHTTPGateway(t *testing.T) {
79-
for _, ten := range []bool{false, true} {
80-
t.Run(fmt.Sprintf("tenancy=%v", ten), func(t *testing.T) {
81-
tenancyOptions := tenancy.Options{
82-
Enabled: ten,
83-
}
84-
tm := tenancy.NewManager(&tenancyOptions)
85-
runGatewayTests(t, "/",
86-
tenancyOptions,
87-
func(req *http.Request) {
88-
if ten {
89-
// Add a tenancy header on outbound requests
90-
req.Header.Add(tm.Header, "dummy")
91-
}
92-
})
93-
})
94-
}
74+
runGatewayTests(t, "/", func(_ *http.Request) {})
9575
}
9676

9777
func TestHTTPGatewayTryHandleError(t *testing.T) {
@@ -126,7 +106,7 @@ func TestHTTPGatewayOTLPError(t *testing.T) {
126106
}
127107

128108
func TestHTTPGatewayGetTraceErrors(t *testing.T) {
129-
gw := setupHTTPGatewayNoServer(t, "", tenancy.Options{})
109+
gw := setupHTTPGatewayNoServer(t, "")
130110

131111
// malformed trace id
132112
r, err := http.NewRequest(http.MethodGet, "/api/v3/traces/xyz", nil)
@@ -233,7 +213,7 @@ func TestHTTPGatewayFindTracesErrors(t *testing.T) {
233213
require.NoError(t, err)
234214
w := httptest.NewRecorder()
235215

236-
gw := setupHTTPGatewayNoServer(t, "", tenancy.Options{})
216+
gw := setupHTTPGatewayNoServer(t, "")
237217
gw.router.ServeHTTP(w, r)
238218
assert.Contains(t, w.Body.String(), tc.expErr)
239219
})
@@ -245,7 +225,7 @@ func TestHTTPGatewayFindTracesErrors(t *testing.T) {
245225
require.NoError(t, err)
246226
w := httptest.NewRecorder()
247227

248-
gw := setupHTTPGatewayNoServer(t, "", tenancy.Options{})
228+
gw := setupHTTPGatewayNoServer(t, "")
249229
gw.reader.
250230
On("FindTraces", matchContext, qp).
251231
Return(nil, errors.New(simErr)).Once()
@@ -256,7 +236,7 @@ func TestHTTPGatewayFindTracesErrors(t *testing.T) {
256236
}
257237

258238
func TestHTTPGatewayGetServicesErrors(t *testing.T) {
259-
gw := setupHTTPGatewayNoServer(t, "", tenancy.Options{})
239+
gw := setupHTTPGatewayNoServer(t, "")
260240

261241
const simErr = "simulated error"
262242
gw.reader.
@@ -271,7 +251,7 @@ func TestHTTPGatewayGetServicesErrors(t *testing.T) {
271251
}
272252

273253
func TestHTTPGatewayGetOperationsErrors(t *testing.T) {
274-
gw := setupHTTPGatewayNoServer(t, "", tenancy.Options{})
254+
gw := setupHTTPGatewayNoServer(t, "")
275255

276256
qp := spanstore.OperationQueryParameters{ServiceName: "foo", SpanKind: "server"}
277257
const simErr = "simulated error"
@@ -285,41 +265,3 @@ func TestHTTPGatewayGetOperationsErrors(t *testing.T) {
285265
gw.router.ServeHTTP(w, r)
286266
assert.Contains(t, w.Body.String(), simErr)
287267
}
288-
289-
func TestHTTPGatewayTenancyRejection(t *testing.T) {
290-
basePath := "/"
291-
tenancyOptions := tenancy.Options{Enabled: true}
292-
gw := setupHTTPGateway(t, basePath, tenancyOptions)
293-
294-
traceID := model.NewTraceID(150, 160)
295-
gw.reader.On("GetTrace", matchContext, matchTraceID).Return(
296-
&model.Trace{
297-
Spans: []*model.Span{
298-
{
299-
TraceID: traceID,
300-
SpanID: model.NewSpanID(180),
301-
OperationName: "foobar",
302-
},
303-
},
304-
}, nil).Once()
305-
306-
req, err := http.NewRequest(http.MethodGet, gw.url+"/api/v3/traces/123", nil)
307-
require.NoError(t, err)
308-
req.Header.Set("Content-Type", "application/json")
309-
// We don't set tenant header
310-
response, err := http.DefaultClient.Do(req)
311-
require.NoError(t, err)
312-
body, err := io.ReadAll(response.Body)
313-
require.NoError(t, err)
314-
require.NoError(t, response.Body.Close())
315-
require.Equal(t, http.StatusUnauthorized, response.StatusCode, "response=%s", string(body))
316-
317-
// Try again with tenant header set
318-
tm := tenancy.NewManager(&tenancyOptions)
319-
req.Header.Set(tm.Header, "acme")
320-
response, err = http.DefaultClient.Do(req)
321-
require.NoError(t, err)
322-
require.NoError(t, response.Body.Close())
323-
require.Equal(t, http.StatusOK, response.StatusCode)
324-
// Skip unmarshal of response; it is enough that it succeeded
325-
}

cmd/query/app/http_handler.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
uiconv "github.com/jaegertracing/jaeger/model/converter/json"
2828
ui "github.com/jaegertracing/jaeger/model/json"
2929
"github.com/jaegertracing/jaeger/pkg/jtracer"
30-
"github.com/jaegertracing/jaeger/pkg/tenancy"
3130
"github.com/jaegertracing/jaeger/plugin/metrics/disabled"
3231
"github.com/jaegertracing/jaeger/proto-gen/api_v2/metrics"
3332
"github.com/jaegertracing/jaeger/storage/metricsstore"
@@ -76,22 +75,20 @@ type APIHandler struct {
7675
queryService *querysvc.QueryService
7776
metricsQueryService querysvc.MetricsQueryService
7877
queryParser queryParser
79-
tenancyMgr *tenancy.Manager
8078
basePath string
8179
apiPrefix string
8280
logger *zap.Logger
8381
tracer trace.TracerProvider
8482
}
8583

8684
// NewAPIHandler returns an APIHandler
87-
func NewAPIHandler(queryService *querysvc.QueryService, tm *tenancy.Manager, options ...HandlerOption) *APIHandler {
85+
func NewAPIHandler(queryService *querysvc.QueryService, options ...HandlerOption) *APIHandler {
8886
aH := &APIHandler{
8987
queryService: queryService,
9088
queryParser: queryParser{
9189
traceQueryLookbackDuration: defaultTraceQueryLookbackDuration,
9290
timeNow: time.Now,
9391
},
94-
tenancyMgr: tm,
9592
}
9693

9794
for _, option := range options {
@@ -135,9 +132,6 @@ func (aH *APIHandler) handleFunc(
135132
) *mux.Route {
136133
route := aH.formatRoute(routeFmt, args...)
137134
var handler http.Handler = http.HandlerFunc(f)
138-
if aH.tenancyMgr.Enabled {
139-
handler = tenancy.ExtractTenantHTTPHandler(aH.tenancyMgr, handler)
140-
}
141135
traceMiddleware := otelhttp.NewHandler(
142136
otelhttp.WithRouteTag(route, traceResponseHandler(handler)),
143137
route,

cmd/query/app/http_handler_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,13 @@ func initializeTestServerWithOptions(
121121
dependencyStorage := &depsmocks.Reader{}
122122
qs := querysvc.NewQueryService(readStorage, dependencyStorage, queryOptions)
123123
r := NewRouter()
124-
handler := NewAPIHandler(qs, tenancyMgr, options...)
125-
handler.RegisterRoutes(r)
124+
apiHandler := NewAPIHandler(qs, options...)
125+
apiHandler.RegisterRoutes(r)
126126
ts := &testServer{
127127
server: httptest.NewServer(tenancy.ExtractTenantHTTPHandler(tenancyMgr, r)),
128128
spanReader: readStorage,
129129
dependencyReader: dependencyStorage,
130-
handler: handler,
130+
handler: apiHandler,
131131
}
132132
t.Cleanup(func() {
133133
ts.server.Close()
@@ -168,7 +168,7 @@ func TestLogOnServerError(t *testing.T) {
168168
readStorage := &spanstoremocks.Reader{}
169169
dependencyStorage := &depsmocks.Reader{}
170170
qs := querysvc.NewQueryService(readStorage, dependencyStorage, querysvc.QueryServiceOptions{})
171-
h := NewAPIHandler(qs, &tenancy.Manager{}, HandlerOptions.Logger(logger))
171+
h := NewAPIHandler(qs, HandlerOptions.Logger(logger))
172172
e := errors.New("test error")
173173
h.handleError(&httptest.ResponseRecorder{}, e, http.StatusInternalServerError)
174174
require.Len(t, logs.All(), 1)

cmd/query/app/server.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,13 @@ type httpServer struct {
203203

204204
var _ io.Closer = (*httpServer)(nil)
205205

206-
func createHTTPServer(
207-
ctx context.Context,
206+
func initRouter(
208207
querySvc *querysvc.QueryService,
209208
metricsQuerySvc querysvc.MetricsQueryService,
210209
queryOpts *QueryOptions,
211-
tm *tenancy.Manager,
210+
tenancyMgr *tenancy.Manager,
212211
telset telemetery.Setting,
213-
) (*httpServer, error) {
212+
) (http.Handler, io.Closer) {
214213
apiHandlerOptions := []HandlerOption{
215214
HandlerOptions.Logger(telset.Logger),
216215
HandlerOptions.Tracer(telset.TracerProvider),
@@ -219,7 +218,6 @@ func createHTTPServer(
219218

220219
apiHandler := NewAPIHandler(
221220
querySvc,
222-
tm,
223221
apiHandlerOptions...)
224222
r := NewRouter()
225223
if queryOpts.BasePath != "/" {
@@ -228,17 +226,33 @@ func createHTTPServer(
228226

229227
(&apiv3.HTTPGateway{
230228
QueryService: querySvc,
231-
TenancyMgr: tm,
232229
Logger: telset.Logger,
233230
Tracer: telset.TracerProvider,
234231
}).RegisterRoutes(r)
235232

236233
apiHandler.RegisterRoutes(r)
234+
staticHandlerCloser := RegisterStaticHandler(r, telset.Logger, queryOpts, querySvc.GetCapabilities())
235+
237236
var handler http.Handler = r
238-
handler = responseHeadersHandler(handler, queryOpts.HTTP.ResponseHeaders)
239237
if queryOpts.BearerTokenPropagation {
240238
handler = bearertoken.PropagationHandler(telset.Logger, handler)
241239
}
240+
if tenancyMgr.Enabled {
241+
handler = tenancy.ExtractTenantHTTPHandler(tenancyMgr, handler)
242+
}
243+
return handler, staticHandlerCloser
244+
}
245+
246+
func createHTTPServer(
247+
ctx context.Context,
248+
querySvc *querysvc.QueryService,
249+
metricsQuerySvc querysvc.MetricsQueryService,
250+
queryOpts *QueryOptions,
251+
tm *tenancy.Manager,
252+
telset telemetery.Setting,
253+
) (*httpServer, error) {
254+
handler, staticHandlerCloser := initRouter(querySvc, metricsQuerySvc, queryOpts, tm, telset)
255+
handler = responseHeadersHandler(handler, queryOpts.HTTP.ResponseHeaders)
242256
handler = handlers.CompressHandler(handler)
243257
recoveryHandler := recoveryhandler.NewRecoveryHandler(telset.Logger, true)
244258

@@ -249,18 +263,17 @@ func createHTTPServer(
249263
ErrorLog: errorLog,
250264
ReadHeaderTimeout: 2 * time.Second,
251265
},
266+
staticHandlerCloser: staticHandlerCloser,
252267
}
253268

254269
if queryOpts.HTTP.TLSSetting != nil {
255270
tlsCfg, err := queryOpts.HTTP.TLSSetting.LoadTLSConfig(ctx) // This checks if the certificates are correctly provided
256271
if err != nil {
257-
return nil, err
272+
return nil, errors.Join(err, staticHandlerCloser.Close())
258273
}
259274
server.TLSConfig = tlsCfg
260275
}
261276

262-
server.staticHandlerCloser = RegisterStaticHandler(r, telset.Logger, queryOpts, querySvc.GetCapabilities())
263-
264277
return server, nil
265278
}
266279

0 commit comments

Comments
 (0)