github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/lokifrontend/frontend/config.go (about) 1 package frontend 2 3 import ( 4 "flag" 5 "net/http" 6 7 "github.com/go-kit/log" 8 "github.com/grafana/dskit/ring" 9 "github.com/pkg/errors" 10 "github.com/prometheus/client_golang/prometheus" 11 12 "github.com/grafana/loki/pkg/lokifrontend/frontend/transport" 13 v1 "github.com/grafana/loki/pkg/lokifrontend/frontend/v1" 14 v2 "github.com/grafana/loki/pkg/lokifrontend/frontend/v2" 15 "github.com/grafana/loki/pkg/util" 16 ) 17 18 // This struct combines several configuration options together to preserve backwards compatibility. 19 type CombinedFrontendConfig struct { 20 Handler transport.HandlerConfig `yaml:",inline"` 21 FrontendV1 v1.Config `yaml:",inline"` 22 FrontendV2 v2.Config `yaml:",inline"` 23 24 DownstreamURL string `yaml:"downstream_url"` 25 } 26 27 func (cfg *CombinedFrontendConfig) RegisterFlags(f *flag.FlagSet) { 28 cfg.Handler.RegisterFlags(f) 29 cfg.FrontendV1.RegisterFlags(f) 30 cfg.FrontendV2.RegisterFlags(f) 31 32 f.StringVar(&cfg.DownstreamURL, "frontend.downstream-url", "", "URL of downstream Prometheus.") 33 } 34 35 // InitFrontend initializes frontend (either V1 -- without scheduler, or V2 -- with scheduler) or no frontend at 36 // all if downstream Prometheus URL is used instead. 37 // 38 // Returned RoundTripper can be wrapped in more round-tripper middlewares, and then eventually registered 39 // into HTTP server using the Handler from this package. Returned RoundTripper is always non-nil 40 // (if there are no errors), and it uses the returned frontend (if any). 41 func InitFrontend(cfg CombinedFrontendConfig, ring ring.ReadRing, limits v1.Limits, grpcListenPort int, log log.Logger, reg prometheus.Registerer) (http.RoundTripper, *v1.Frontend, *v2.Frontend, error) { 42 switch { 43 case cfg.DownstreamURL != "": 44 // If the user has specified a downstream Prometheus, then we should use that. 45 rt, err := NewDownstreamRoundTripper(cfg.DownstreamURL, http.DefaultTransport) 46 return rt, nil, nil, err 47 case cfg.FrontendV2.SchedulerAddress != "" || ring != nil: 48 // If query-scheduler address is configured, use Frontend. 49 if cfg.FrontendV2.Addr == "" { 50 addr, err := util.GetFirstAddressOf(cfg.FrontendV2.InfNames) 51 if err != nil { 52 return nil, nil, nil, errors.Wrap(err, "failed to get frontend address") 53 } 54 55 cfg.FrontendV2.Addr = addr 56 } 57 58 if cfg.FrontendV2.Port == 0 { 59 cfg.FrontendV2.Port = grpcListenPort 60 } 61 62 fr, err := v2.NewFrontend(cfg.FrontendV2, ring, log, reg) 63 return transport.AdaptGrpcRoundTripperToHTTPRoundTripper(fr), nil, fr, err 64 65 default: 66 // No scheduler = use original frontend. 67 fr, err := v1.New(cfg.FrontendV1, limits, log, reg) 68 if err != nil { 69 return nil, nil, nil, err 70 } 71 return transport.AdaptGrpcRoundTripperToHTTPRoundTripper(fr), fr, nil, nil 72 } 73 }