Skip to content

Commit fdcdbf0

Browse files
refactor(web): move to provider pattern (#6838)
### Summary move to provider pattern
1 parent c92ef53 commit fdcdbf0

File tree

7 files changed

+129
-91
lines changed

7 files changed

+129
-91
lines changed

ee/query-service/app/server.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ func (s *Server) createPrivateServer(apiHandler *api.APIHandler) (*http.Server,
351351
}, nil
352352
}
353353

354-
func (s *Server) createPublicServer(apiHandler *api.APIHandler, web *web.Web) (*http.Server, error) {
354+
func (s *Server) createPublicServer(apiHandler *api.APIHandler, web web.Web) (*http.Server, error) {
355355

356356
r := baseapp.NewRouter()
357357

pkg/signoz/signoz.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import (
66
"go.signoz.io/signoz/pkg/cache/rediscache"
77
"go.signoz.io/signoz/pkg/config"
88
"go.signoz.io/signoz/pkg/web"
9+
"go.signoz.io/signoz/pkg/web/routerweb"
910
"go.uber.org/zap"
1011
)
1112

1213
type SigNoz struct {
1314
Cache cache.Cache
14-
Web *web.Web
15+
Web web.Web
1516
}
1617

1718
func New(config *config.Config, skipWebFrontend bool) (*SigNoz, error) {
@@ -25,7 +26,7 @@ func New(config *config.Config, skipWebFrontend bool) (*SigNoz, error) {
2526
cache = rediscache.New(&config.Cache.Redis)
2627
}
2728

28-
web, err := web.New(zap.L(), config.Web)
29+
web, err := routerweb.New(zap.L(), config.Web)
2930
if err != nil && !skipWebFrontend {
3031
return nil, err
3132
}

pkg/web/noopweb/provider.go

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package noopweb
2+
3+
import (
4+
"context"
5+
"net/http"
6+
7+
"github.com/gorilla/mux"
8+
"go.signoz.io/signoz/pkg/factory"
9+
"go.signoz.io/signoz/pkg/web"
10+
)
11+
12+
type provider struct{}
13+
14+
func New(ctx context.Context, settings factory.ProviderSettings, config web.Config) (web.Web, error) {
15+
return &provider{}, nil
16+
}
17+
18+
func (provider *provider) AddToRouter(router *mux.Router) error {
19+
return nil
20+
}
21+
22+
func (provider *provider) ServeHTTP(w http.ResponseWriter, r *http.Request) {}

pkg/web/routerweb/provider.go

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package routerweb
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
"os"
7+
"path/filepath"
8+
"time"
9+
10+
"github.com/gorilla/mux"
11+
"go.signoz.io/signoz/pkg/http/middleware"
12+
"go.signoz.io/signoz/pkg/web"
13+
"go.uber.org/zap"
14+
)
15+
16+
const (
17+
indexFileName string = "index.html"
18+
)
19+
20+
type Web struct {
21+
logger *zap.Logger
22+
cfg web.Config
23+
}
24+
25+
func New(logger *zap.Logger, cfg web.Config) (*Web, error) {
26+
if logger == nil {
27+
return nil, fmt.Errorf("cannot build web, logger is required")
28+
}
29+
30+
fi, err := os.Stat(cfg.Directory)
31+
if err != nil {
32+
return nil, fmt.Errorf("cannot access web directory: %w", err)
33+
}
34+
35+
ok := fi.IsDir()
36+
if !ok {
37+
return nil, fmt.Errorf("web directory is not a directory")
38+
}
39+
40+
fi, err = os.Stat(filepath.Join(cfg.Directory, indexFileName))
41+
if err != nil {
42+
return nil, fmt.Errorf("cannot access %q in web directory: %w", indexFileName, err)
43+
}
44+
45+
if os.IsNotExist(err) || fi.IsDir() {
46+
return nil, fmt.Errorf("%q does not exist", indexFileName)
47+
}
48+
49+
return &Web{
50+
logger: logger.Named("go.signoz.io/pkg/web"),
51+
cfg: cfg,
52+
}, nil
53+
}
54+
55+
func (web *Web) AddToRouter(router *mux.Router) error {
56+
cache := middleware.NewCache(7 * 24 * time.Hour)
57+
err := router.PathPrefix(web.cfg.Prefix).
58+
Handler(
59+
http.StripPrefix(
60+
web.cfg.Prefix,
61+
cache.Wrap(http.HandlerFunc(web.ServeHTTP)),
62+
),
63+
).GetError()
64+
if err != nil {
65+
return fmt.Errorf("unable to add web to router: %w", err)
66+
}
67+
68+
return nil
69+
}
70+
71+
func (web *Web) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
72+
// Join internally call path.Clean to prevent directory traversal
73+
path := filepath.Join(web.cfg.Directory, req.URL.Path)
74+
75+
// check whether a file exists or is a directory at the given path
76+
fi, err := os.Stat(path)
77+
if os.IsNotExist(err) || fi.IsDir() {
78+
// file does not exist or path is a directory, serve index.html
79+
http.ServeFile(rw, req, filepath.Join(web.cfg.Directory, indexFileName))
80+
return
81+
}
82+
83+
if err != nil {
84+
// if we got an error (that wasn't that the file doesn't exist) stating the
85+
// file, return a 500 internal server error and stop
86+
// TODO: Put down a crash html page here
87+
http.Error(rw, err.Error(), http.StatusInternalServerError)
88+
return
89+
}
90+
91+
// otherwise, use http.FileServer to serve the static file
92+
http.FileServer(http.Dir(web.cfg.Directory)).ServeHTTP(rw, req)
93+
}

pkg/web/web_test.go pkg/web/routerweb/provider_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package web
1+
package routerweb
22

33
import (
44
"io"
@@ -11,6 +11,7 @@ import (
1111
"github.com/gorilla/mux"
1212
"github.com/stretchr/testify/assert"
1313
"github.com/stretchr/testify/require"
14+
"go.signoz.io/signoz/pkg/web"
1415
"go.uber.org/zap"
1516
)
1617

@@ -22,7 +23,7 @@ func TestServeHttpWithoutPrefix(t *testing.T) {
2223
expected, err := io.ReadAll(fi)
2324
require.NoError(t, err)
2425

25-
web, err := New(zap.NewNop(), Config{Prefix: "/", Directory: filepath.Join("testdata")})
26+
web, err := New(zap.NewNop(), web.Config{Prefix: "/", Directory: filepath.Join("testdata")})
2627
require.NoError(t, err)
2728

2829
router := mux.NewRouter()
@@ -87,7 +88,7 @@ func TestServeHttpWithPrefix(t *testing.T) {
8788
expected, err := io.ReadAll(fi)
8889
require.NoError(t, err)
8990

90-
web, err := New(zap.NewNop(), Config{Prefix: "/web", Directory: filepath.Join("testdata")})
91+
web, err := New(zap.NewNop(), web.Config{Prefix: "/web", Directory: filepath.Join("testdata")})
9192
require.NoError(t, err)
9293

9394
router := mux.NewRouter()
File renamed without changes.

pkg/web/web.go

+6-85
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,15 @@
11
package web
22

33
import (
4-
"fmt"
54
"net/http"
6-
"os"
7-
"path/filepath"
8-
"time"
95

106
"github.com/gorilla/mux"
11-
"go.signoz.io/signoz/pkg/http/middleware"
12-
"go.uber.org/zap"
137
)
148

15-
var _ http.Handler = (*Web)(nil)
16-
17-
const (
18-
indexFileName string = "index.html"
19-
)
20-
21-
type Web struct {
22-
logger *zap.Logger
23-
cfg Config
24-
}
25-
26-
func New(logger *zap.Logger, cfg Config) (*Web, error) {
27-
if logger == nil {
28-
return nil, fmt.Errorf("cannot build web, logger is required")
29-
}
30-
31-
fi, err := os.Stat(cfg.Directory)
32-
if err != nil {
33-
return nil, fmt.Errorf("cannot access web directory: %w", err)
34-
}
35-
36-
ok := fi.IsDir()
37-
if !ok {
38-
return nil, fmt.Errorf("web directory is not a directory")
39-
}
40-
41-
fi, err = os.Stat(filepath.Join(cfg.Directory, indexFileName))
42-
if err != nil {
43-
return nil, fmt.Errorf("cannot access %q in web directory: %w", indexFileName, err)
44-
}
45-
46-
if os.IsNotExist(err) || fi.IsDir() {
47-
return nil, fmt.Errorf("%q does not exist", indexFileName)
48-
}
49-
50-
return &Web{
51-
logger: logger.Named("go.signoz.io/pkg/web"),
52-
cfg: cfg,
53-
}, nil
54-
}
55-
56-
func (web *Web) AddToRouter(router *mux.Router) error {
57-
cache := middleware.NewCache(7 * 24 * time.Hour)
58-
err := router.PathPrefix(web.cfg.Prefix).
59-
Handler(
60-
http.StripPrefix(
61-
web.cfg.Prefix,
62-
cache.Wrap(http.HandlerFunc(web.ServeHTTP)),
63-
),
64-
).GetError()
65-
if err != nil {
66-
return fmt.Errorf("unable to add web to router: %w", err)
67-
}
68-
69-
return nil
70-
}
71-
72-
func (web *Web) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
73-
// Join internally call path.Clean to prevent directory traversal
74-
path := filepath.Join(web.cfg.Directory, req.URL.Path)
75-
76-
// check whether a file exists or is a directory at the given path
77-
fi, err := os.Stat(path)
78-
if os.IsNotExist(err) || fi.IsDir() {
79-
// file does not exist or path is a directory, serve index.html
80-
http.ServeFile(rw, req, filepath.Join(web.cfg.Directory, indexFileName))
81-
return
82-
}
83-
84-
if err != nil {
85-
// if we got an error (that wasn't that the file doesn't exist) stating the
86-
// file, return a 500 internal server error and stop
87-
// TODO: Put down a crash html page here
88-
http.Error(rw, err.Error(), http.StatusInternalServerError)
89-
return
90-
}
91-
92-
// otherwise, use http.FileServer to serve the static file
93-
http.FileServer(http.Dir(web.cfg.Directory)).ServeHTTP(rw, req)
9+
// Web is the interface that wraps the methods of the web package.
10+
type Web interface {
11+
// AddToRouter adds the web routes to an existing router.
12+
AddToRouter(router *mux.Router) error
13+
// ServeHTTP serves the web routes.
14+
http.Handler
9415
}

0 commit comments

Comments
 (0)