Skip to content

Commit 27baaca

Browse files
authored
Merge pull request #2117 from tghosgor/master
added --uri_base_prefix option (#2018)
2 parents df781ef + 8018ee1 commit 27baaca

File tree

3 files changed

+34
-9
lines changed

3 files changed

+34
-9
lines changed

cadvisor.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ var collectorKey = flag.String("collector_key", "", "Key for the collector's cer
6262

6363
var storeContainerLabels = flag.Bool("store_container_labels", true, "convert container labels and environment variables into labels on prometheus metrics for each container. If flag set to false, then only metrics exported are container name, first alias, and image name")
6464

65+
var urlBasePrefix = flag.String("url_base_prefix", "", "prefix path that will be prepended to all paths to support some reverse proxies")
66+
6567
var (
6668
// Metrics to be ignored.
6769
// Tcp metrics are ignored by default.
@@ -156,7 +158,7 @@ func main() {
156158
}
157159

158160
// Register all HTTP handlers.
159-
err = cadvisorhttp.RegisterHandlers(mux, containerManager, *httpAuthFile, *httpAuthRealm, *httpDigestFile, *httpDigestRealm)
161+
err = cadvisorhttp.RegisterHandlers(mux, containerManager, *httpAuthFile, *httpAuthRealm, *httpDigestFile, *httpDigestRealm, *urlBasePrefix)
160162
if err != nil {
161163
klog.Fatalf("Failed to register HTTP handlers: %v", err)
162164
}
@@ -177,8 +179,11 @@ func main() {
177179

178180
klog.V(1).Infof("Starting cAdvisor version: %s-%s on port %d", version.Info["version"], version.Info["revision"], *argPort)
179181

182+
rootMux := http.NewServeMux()
183+
rootMux.Handle(*urlBasePrefix+"/", http.StripPrefix(*urlBasePrefix, mux))
184+
180185
addr := fmt.Sprintf("%s:%d", *argIp, *argPort)
181-
klog.Fatal(http.ListenAndServe(addr, mux))
186+
klog.Fatal(http.ListenAndServe(addr, rootMux))
182187
}
183188

184189
func setMaxProcs() {

http/handlers.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import (
3535
"k8s.io/klog"
3636
)
3737

38-
func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm string) error {
38+
func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm string, urlBasePrefix string) error {
3939
// Basic health handler.
4040
if err := healthz.RegisterHandler(mux); err != nil {
4141
return fmt.Errorf("failed to register healthz handler: %s", err)
@@ -55,7 +55,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
5555
}
5656

5757
// Redirect / to containers page.
58-
mux.Handle("/", http.RedirectHandler(pages.ContainersPage, http.StatusTemporaryRedirect))
58+
mux.Handle("/", http.RedirectHandler(urlBasePrefix+pages.ContainersPage, http.StatusTemporaryRedirect))
5959

6060
var authenticated bool
6161

@@ -65,7 +65,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
6565
secrets := auth.HtpasswdFileProvider(httpAuthFile)
6666
authenticator := auth.NewBasicAuthenticator(httpAuthRealm, secrets)
6767
mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler))
68-
if err := pages.RegisterHandlersBasic(mux, containerManager, authenticator); err != nil {
68+
if err := pages.RegisterHandlersBasic(mux, containerManager, authenticator, urlBasePrefix); err != nil {
6969
return fmt.Errorf("failed to register pages auth handlers: %s", err)
7070
}
7171
authenticated = true
@@ -75,7 +75,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
7575
secrets := auth.HtdigestFileProvider(httpDigestFile)
7676
authenticator := auth.NewDigestAuthenticator(httpDigestRealm, secrets)
7777
mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler))
78-
if err := pages.RegisterHandlersDigest(mux, containerManager, authenticator); err != nil {
78+
if err := pages.RegisterHandlersDigest(mux, containerManager, authenticator, urlBasePrefix); err != nil {
7979
return fmt.Errorf("failed to register pages digest handlers: %s", err)
8080
}
8181
authenticated = true
@@ -84,7 +84,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
8484
// Change handler based on authenticator initalization
8585
if !authenticated {
8686
mux.HandleFunc(static.StaticResource, staticHandlerNoAuth)
87-
if err := pages.RegisterHandlersBasic(mux, containerManager, nil); err != nil {
87+
if err := pages.RegisterHandlersBasic(mux, containerManager, nil, urlBasePrefix); err != nil {
8888
return fmt.Errorf("failed to register pages handlers: %s", err)
8989
}
9090
}

pages/pages.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func dockerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFu
100100
}
101101

102102
// Register http handlers
103-
func RegisterHandlersDigest(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.DigestAuth) error {
103+
func RegisterHandlersDigest(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.DigestAuth, urlBasePrefix string) error {
104104
// Register the handler for the containers page.
105105
if authenticator != nil {
106106
mux.HandleFunc(ContainersPage, authenticator.Wrap(containerHandler(containerManager)))
@@ -109,10 +109,20 @@ func RegisterHandlersDigest(mux httpmux.Mux, containerManager manager.Manager, a
109109
mux.HandleFunc(ContainersPage, containerHandlerNoAuth(containerManager))
110110
mux.HandleFunc(DockerPage, dockerHandlerNoAuth(containerManager))
111111
}
112+
113+
if ContainersPage[len(ContainersPage)-1] == '/' {
114+
redirectHandler := http.RedirectHandler(urlBasePrefix+ContainersPage, http.StatusMovedPermanently)
115+
mux.Handle(ContainersPage[0:len(ContainersPage)-1], redirectHandler)
116+
}
117+
if DockerPage[len(DockerPage)-1] == '/' {
118+
redirectHandler := http.RedirectHandler(urlBasePrefix+DockerPage, http.StatusMovedPermanently)
119+
mux.Handle(DockerPage[0:len(DockerPage)-1], redirectHandler)
120+
}
121+
112122
return nil
113123
}
114124

115-
func RegisterHandlersBasic(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.BasicAuth) error {
125+
func RegisterHandlersBasic(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.BasicAuth, urlBasePrefix string) error {
116126
// Register the handler for the containers and docker age.
117127
if authenticator != nil {
118128
mux.HandleFunc(ContainersPage, authenticator.Wrap(containerHandler(containerManager)))
@@ -121,6 +131,16 @@ func RegisterHandlersBasic(mux httpmux.Mux, containerManager manager.Manager, au
121131
mux.HandleFunc(ContainersPage, containerHandlerNoAuth(containerManager))
122132
mux.HandleFunc(DockerPage, dockerHandlerNoAuth(containerManager))
123133
}
134+
135+
if ContainersPage[len(ContainersPage)-1] == '/' {
136+
redirectHandler := http.RedirectHandler(urlBasePrefix+ContainersPage, http.StatusMovedPermanently)
137+
mux.Handle(ContainersPage[0:len(ContainersPage)-1], redirectHandler)
138+
}
139+
if DockerPage[len(DockerPage)-1] == '/' {
140+
redirectHandler := http.RedirectHandler(urlBasePrefix+DockerPage, http.StatusMovedPermanently)
141+
mux.Handle(DockerPage[0:len(DockerPage)-1], redirectHandler)
142+
}
143+
124144
return nil
125145
}
126146

0 commit comments

Comments
 (0)