diff --git a/pkg/loki/loki.go b/pkg/loki/loki.go index 95127c947499..f2dceafd870d 100644 --- a/pkg/loki/loki.go +++ b/pkg/loki/loki.go @@ -29,6 +29,7 @@ import ( "github.com/grafana/loki/pkg/distributor" "github.com/grafana/loki/pkg/ingester" "github.com/grafana/loki/pkg/ingester/client" + "github.com/grafana/loki/pkg/lokifrontend" "github.com/grafana/loki/pkg/querier" "github.com/grafana/loki/pkg/querier/queryrange" "github.com/grafana/loki/pkg/storage" @@ -54,7 +55,7 @@ type Config struct { LimitsConfig validation.Limits `yaml:"limits_config,omitempty"` TableManager chunk.TableManagerConfig `yaml:"table_manager,omitempty"` Worker frontend.WorkerConfig `yaml:"frontend_worker,omitempty"` - Frontend frontend.Config `yaml:"frontend,omitempty"` + Frontend lokifrontend.Config `yaml:"frontend,omitempty"` QueryRange queryrange.Config `yaml:"query_range,omitempty"` RuntimeConfig runtimeconfig.ManagerConfig `yaml:"runtime_config,omitempty"` MemberlistKV memberlist.KVConfig `yaml:"memberlist"` diff --git a/pkg/loki/modules.go b/pkg/loki/modules.go index 1bff071dd04a..77b9fea71b36 100644 --- a/pkg/loki/modules.go +++ b/pkg/loki/modules.go @@ -4,6 +4,8 @@ import ( "errors" "fmt" "net/http" + "net/http/httputil" + "net/url" "os" "sort" "time" @@ -267,7 +269,7 @@ func (t *Loki) initStore() (_ services.Service, err error) { func (t *Loki) initQueryFrontend() (_ services.Service, err error) { level.Debug(util.Logger).Log("msg", "initializing query frontend", "config", fmt.Sprintf("%+v", t.cfg.Frontend)) - t.frontend, err = frontend.New(t.cfg.Frontend, util.Logger, prometheus.DefaultRegisterer) + t.frontend, err = frontend.New(t.cfg.Frontend.Config, util.Logger, prometheus.DefaultRegisterer) if err != nil { return } @@ -297,6 +299,21 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) { serverutil.NewPrepopulateMiddleware(), ).Wrap(t.frontend.Handler()) + var defaultHandler http.Handler + if t.cfg.Frontend.TailProxyUrl != "" { + httpMiddleware := middleware.Merge( + t.httpAuthMiddleware, + queryrange.StatsHTTPMiddleware, + ) + tailURL, err := url.Parse(t.cfg.Frontend.TailProxyUrl) + if err != nil { + return nil, err + } + tp := httputil.NewSingleHostReverseProxy(tailURL) + defaultHandler = httpMiddleware.Wrap(tp) + } else { + defaultHandler = frontendHandler + } t.server.HTTP.Handle("/loki/api/v1/query_range", frontendHandler) t.server.HTTP.Handle("/loki/api/v1/query", frontendHandler) t.server.HTTP.Handle("/loki/api/v1/label", frontendHandler) @@ -308,7 +325,7 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) { t.server.HTTP.Handle("/api/prom/label/{name}/values", frontendHandler) t.server.HTTP.Handle("/api/prom/series", frontendHandler) // fallback route - t.server.HTTP.PathPrefix("/").Handler(frontendHandler) + t.server.HTTP.PathPrefix("/").Handler(defaultHandler) return services.NewIdleService(nil, func(_ error) error { t.frontend.Close() diff --git a/pkg/lokifrontend/config.go b/pkg/lokifrontend/config.go new file mode 100644 index 000000000000..50a3627f5f49 --- /dev/null +++ b/pkg/lokifrontend/config.go @@ -0,0 +1,17 @@ +package lokifrontend + +import ( + "flag" + "github.com/cortexproject/cortex/pkg/querier/frontend" +) + +type Config struct { + frontend.Config `yaml:",inline"` + TailProxyUrl string `yaml:"tail_proxy_url"` +} + +// RegisterFlags adds the flags required to config this to the given FlagSet. +func (cfg *Config) RegisterFlags(f *flag.FlagSet) { + cfg.Config.RegisterFlags(f) + f.StringVar(&cfg.TailProxyUrl, "frontend.tail-proxy-url", "", "URL of querier for tail proxy.") +} \ No newline at end of file