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  }